HOJ 1003 Max Sum 解题报告
好几年没有做ACM了,感觉忘得差不多了,这个做着做着就打瞌睡了!言归正传,下面是我的解题思路:
首先的话,我们可以画一个函数图,以输入数组的下标为X轴,以数组的和为Y轴,当数组和小于零时,我们使用备用的数组和sum2和备用的最小下标min2,并用flag进行标记。具体实现可以参考代码。
需要注意的地方有:当数组所有值都小于零时,我们在此进行特别的处理,找出最小的负数和相应的下标,然后在输出时和非全负数组的结果分开。(第一次提交的时候,没有考虑到全负的情况,WA了一次)
#include <stdio.h> int main() { int n,num,i,c; int min1,min2,max,sum1,sum2,temp,flag; //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); scanf("%d",&n); for(c=1; c<=n; c++) { scanf("%d",&num); flag = sum1 = sum2 = 0; min1 = min2 = max = 1; int m, s, f=0; for(i=1; i <= num; i++) { scanf("%d",&temp); if(temp >= 0)f=1; if(1 == i){ m = temp; s = i; } else if(0 == f && temp > m){ m = temp; s = i; } if(flag) //if sum2 < 0, then execute follow action. { if(temp >= 0) { sum2 = temp; min2 = i; flag = 0; } else{ continue; } }else{ sum2 += temp; } if(sum2 >= sum1) { max = i; sum1 = sum2; min1 = min2; } else if(sum2 < 0) { flag = 1; } } printf("Case %d:\n",c); if(1 == f){ printf("%d %d %d\n",sum1,min1,max); } else{ printf("%d %d %d\n",m,s,s); } if(c < n)printf("\n"); } return 0; }