额,编程啦刚刚挂了,现在修好了,可以提交了。7楼的我测了,超时╮(╯_╰)╭
程序代码:#include <stdio.h>
int Rp[1000001];
main(){
int n;
int i;
long long subRp[2],addRp[2]; //subRp[n%2]与addRp[n%2]存放的是做不做该件事的结果。
//其中subRp[(n+1)%2]是做下一个事件是减人品,而addRp[(n+1)%2]是涨人品。
while(scanf("%d",&n)!=EOF) {
if(n<=0)
break;
for(i=1;i<=n;i++)
scanf("%d",&Rp[i]);
subRp[0]=0;//刚开始为0,那么做下一件事情的人品值就是0-Rp[i]
addRp[0]=0;//初始化为0,做下一件事情的人品值是0+Rp[i];
for(i=1;i<=n;i++)
{
//subRp为做与不做第i件事的结果的最大值
//这里要注意下,因为subRp存放的是:做下一个事件是减人品的那些值。
//比如i%2=0,那么subRp[1]是上次的结果。这个时候可以选择不做,那么subRp[0]=subRp[1],
//假如做了,那么下次事件就是涨人品的,是要存在addRp[0]中的,而addRp[1]做该事件,
//下次就是减人品的。所以做该事件的时候,subRp[0]=addRp[1]+Rp[i];最后比较subRp[1]与
//addRp[1]+Rp[i],其中较大的值就是subRp[0]的值。addRp中的值也是这么求的。
if(subRp[(i-1)%2]<addRp[(i-1)%2]+Rp[i])
subRp[i%2]=addRp[(i-1)%2]+Rp[i];
else
subRp[i%2]=subRp[(i-1)%2];
if(addRp[(i-1)%2]<subRp[(i-1)%2]-Rp[i])
addRp[i%2]=subRp[(i-1)%2]-Rp[i];
else
addRp[i%2]=addRp[(i-1)%2];
}
if(addRp[n%2]>subRp[n%2])
subRp[n%2]=addRp[n%2];
printf("%lld\n",subRp[n%2]);
}
}







