6 -2 11 -4 13 -5 -2 10 -10 1 2 3 4 -5 -23 3 7 -21 6 5 -8 3 2 5 0 1 10 3 -1 -5 -2 3 -1 0 -2 0
20 11 13 10 1 4 10 3 5 10 10 10 0 -1 -2 0 0 0Huge input, scanf is recommended.HintHint
这个代码是贪心做的.这题也可以用dp.
#include<stdio.h> #include<stdlib.h> int main() { int re,st,n,haha,sum,flag,maxx,i,a,st2; while(scanf("%d",&n),n) { haha=0;//记录有没有大于等于0的 sum=0;//当前集合包里的值 maxx=-1; flag=1; for(i=0;i<n;i++) { scanf("%d",&a); if(a>=0) haha=1; if(haha==0)//如果 没有大于等于0的数记录下开头和结尾 { if(i==0) st=a; if(i==n-1) re=a; } sum+=a;//开始贪心 if(sum>=0&&flag) //大于0 都有可能.记录下最开始的. { st2=a; flag=0; } if(sum>maxx)//贪心思想 从左端开始. 只要和大于等于0 就记录下来. { maxx=sum; re=a; st=st2; } if(sum<0)// 如果 和要小于0 那么之前最大的就是maxx了. 然后重新开始找. { sum=0; flag=1; } } if(haha) printf("%d %d %d\n",maxx,st,re); else printf("0 %d %d\n",st,re); } return 0; }