最大子段和也要讲。。。。
#include <stdio.h> int num[100001]; int main() { int l,n,i,sum,ps,pe,max,j,t=1,flag; scanf("%d",&l); while(l--) { flag=1; max=-2000; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&num[i]); if(num[i]>0) flag=0; else { if(flag&&num[i]>max) { ps=pe=i; max=num[i]; } } } if(!flag) { max=-1; sum=j=0; for(i=0;i<n;i++) { sum+=num[i]; if(sum>max) { ps=j; pe=i; max=sum; } else if(sum<0) { sum=0; j=i+1; } } } if(t>1) printf("\n"); printf("Case %d:\n",t); printf("%d %d %d\n",max,ps+1,pe+1); t++; } return 0; }
#include <stdio.h> int main() { int a[100002]={0},n,m,flag=0; long N,yisum=-10001,j,i,p1,p2,ersum=0,k=0,position; scanf("%d",&n); m=n; while(n--) { flag=0; if(m>=0&&m<=20) { scanf("%ld",&N); for(j=0;j<N;j++) scanf("%d",&a[j]); for(j=0;j<N;j++) if(a[j]>0) { flag=1; break; } if(!flag) { yisum=-999999999; for(i=0;i<N;i++) if(yisum<a[i]) { yisum=a[i]; position=i; } goto A; } for(j=0;j<N&&flag;j++) { ersum=ersum+a[j]; if(ersum<0) { ersum=0; continue; } else if(yisum<ersum) { yisum=ersum; p2=j; } } ersum=0; for(k=p2;k>=0;k--) { ersum=ersum+a[k]; if(ersum==yisum) p1=k; } A: printf("Case %d:\n",m-n); if(flag) printf("%ld %ld %ld\n",yisum,p1+1,p2+1); else printf("%ld %ld %ld\n",yisum,position+1,position+1); yisum=-10001;ersum=0; for(j=0;j<N;j++) a[j]=0; } if(n) printf("\n"); } return 0; }