额,编程啦刚刚挂了,现在修好了,可以提交了。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]); } }