题目大意:题目给出n个塔以及各个塔的高度,现在从第一个塔开始跳,跳完所有塔。如果前面塔高出现在所在的塔,就看自己的能量值能否跳上去,如果不能则用dollar支付其需要的费用。如果前面的低于现在的,则能量值增加两者之间的差值。问游戏结束需要最少花费多少dollar?
解题思路:对于第一个点的处理,直接将花费初始为第一个点。然后就依次判断,分两种情况:一是前面塔低于后面塔,则能量值增加两者的差值,dollar值不变;二是前面塔高于后面的,先看能量值,如果等于0,则dollar值增加两者之间的差值,如果能量值小于塔之间的差值,则dollar值增加差值减去能量值,并将能量值置为0.如果能量值大于差值,则dollar值不变,能量值减去差值即可。直接就这样模拟就可以了,详见code。
题目来源:http://codeforces.com/problemset/problem/463/B
code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 100000+10;
int n,sum,tmp;
int h[MAXN];
int main(){
while(scanf("%d",&n)!=EOF){
memset(h,0,sizeof(h));
for(int i=0;i<n;i++)
scanf("%d",&h[i]);
sum=h[0];tmp=0;
for(int i=0;i<n-1;i++){
if(h[i]<h[i+1]){
if(tmp==0) sum+=h[i+1]-h[i];
else if(tmp<h[i+1]-h[i]){sum+=h[i+1]-h[i]-tmp;tmp=0;}
else{tmp-=h[i+1]-h[i];}
}
else tmp+=h[i]-h[i+1];
}
printf("%d\n",sum);
}
return 0;
}