pascal问题,能解答么?

小明的破旧围栏又要喷涂油漆了。围栏由N个木板构成,每个宽度都为1cm,但是高度各不相同。他给自己买了一个喷漆机器,喷涂头恰好也是1cm宽。小明的喷漆机器是直接喷射的,因此... 小明的破旧围栏又要喷涂油漆了。围栏由N个木板构成,每个宽度都为1cm,但是高度各不相同。他给自己买了一个喷漆机器,喷涂头恰好也是1cm宽。
小明的喷漆机器是直接喷射的,因此喷头的每一个部位必须一直接触到木板,否则尤其会污染他的农田。并且机器也必须时刻与地面平行。可以看出,小明每次必须在同一高度对木板喷涂,可以从左到右直到没有围栏可以喷漆。这样,若干次喷漆之后,就可以将围栏翻新啦!
由于机器的特殊性,小明希望喷涂的次数尽量的少。
小明想要知道至少需要刷多少次就可以把围栏都刷完,请你帮忙计算一下!
展开
 我来答
BGHnnb
2014-05-30 · TA获得超过276个赞
知道小有建树答主
回答量:140
采纳率:50%
帮助的人:122万
展开全部

      本题需要一定的抽象思维能力,是2014年noip提高组(即高中组)的第一题改编版。思路:

      本题可以用类似贪心的思路得到。比如说如果我们按照第一列开始涂,那么显然我们必须要涂第一列高度次才可以涂完。然后我们再来看第二列。如果第二列没有第一列高(或一样高),那么第一列显然可以在涂的过程中顺便把第二列也给涂完。如果第二列比第一列高呢?那么我们涂完第一列后,首先把第二列中和第一列相同高度的部分也给涂完。

       推及到每一列,假设第i列比第i-1列高或一样(如图1-2):那么在涂第i列的时候,可以在涂a高度时把i+1列也给涂完;假设第i列比第i+1列低,那么在涂完a高度时,还需要再涂b-a高度才可以把第i+1列涂完。

       那么对于三列或者更多的情况呢?其实也是一样的,我们仍然一列列看。假设为i,i+1,i+2列时,那么仍然是现将第i列涂满,再涂第i+1列没有涂完的部分(如果需要的话),那么,对于第i+2列,我们可以将第i列中移到第i+1列的喷涂机器再增加一个宽,顺便涂完。

       详情请看程序:

var

  i,n,x,y,ans:longint;

begin

  readln(n);

  for i:=1 to n do

     begin

         read(x); if x>y then ans:=ans+x-y; y:=x;//这是核心。如果后一列没有前一列高,就说明可以直接涂满。否则,涂上前一列没有涂到的地方,也就是高的地方。

     end;

  writeln(ans):

end.

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式