考虑这样的一个序列h(1),h(2),......h(n)即问题中所说的“积木”。应题目要求,每次只能选择一个区间的积木,将其全部+1。这样对于每一个h(i),分为两种情况讨论:若h(i)<h(i-1),则可以在覆盖h(i-1)时“顺便”将h(i)覆盖上,操作数不需要改变;若h(i)>h(i-1),则不得不多覆盖一次,操作数+1。最终就会得到最小的操作数。
#include<cstdio>
#include<iostream>
#include<algorithm>
#define COGS
using namespace std;
int read()
{
int x,f=1;
char ch;
while(ch=getchar(),!isdigit(ch)){
if(ch=='-')f=-1;
if(ch==EOF)return -1;
}
x=ch-48;
while(ch=getchar(),isdigit(ch))x=x*10+ch-48;
return x*f;
}
int main()
{
#ifdef COGS
freopen("BlockNOIP2013.in","r",stdin);
freopen("BlockNOIP2013.out","w",stdout);
#endif
int n,a,b,ans=0;
n=read();
b=read();
ans+=b;
for(int i=1;i<n;i++){
a=read();
if(a>b)ans+=a-b;
b=a;
}
printf("%d",ans);
return 0;
}