http://acm.hdu.edu.cn/showproblem.php?pid=1003 只有这个代码能通过 /* 1003 Max Sum Time Limit : 1000 ms Memory Limit : 32768 K Output Limit : 1024 K GUN C input 4 -6 -8 0 -3 output 0 1 1 OJ有错误,连不正确的也AC */ #include <stdio.h> int input[100000]; int main() { int i,j; int start,end; int x,y; int b; int n; int max; int cs,k; int flag; scanf("%d",&cs); for(k=1;k<=cs;k++) { printf("Case %d:/n",k); scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&input[i]); x=0;y=0; start=0;end=0; max=-10000000; b=0; flag=0; for(i=0;i<n;i++) { if(input[i]>=0) { if(flag==0) { max=0; x=i; } flag=1; } if(flag==1) { if(b+input[i]<0) { b=0; x=i+1; } else { b=b+input[i]; y=i; } if(max<b) { max=b; start=x+1; end=y+1; } } else { if(max<input[i]) { max=input[i]; start=i+1; end=i+1; } } } printf("%d %d %d/n",max,start,end); if(k!=cs) printf("/n"); } return 0; } 下面这两个没通过 /* 1003 Max Sum Time Limit : 1000 ms Memory Limit : 32768 K Output Limit : 1024 K GUN C input 4 -6 -8 0 -3 output 0 3 3 */ #include <stdio.h> #include <stdlib.h> #define T 20 #define N 100000 int main() { int t,n,ca,cb,now,add,sub,flag,start,end,p1,p2; int num[N]={0}; if(scanf("%d",&t)==1) { if(t>T) return 0; for(ca=0;ca<t;ca++) { printf("Case %d:/n",ca+1); scanf("%d",&n); p1=p2=start=end=flag=now=add=sub=0; for(cb=1;cb<=n;cb++) { scanf("%d",&num[cb]); switch(flag) { case 0: if(num[cb]>=0) { now+=num[cb]; end=cb; if(start==0) start=cb; } else { if(end!=0) { flag=1;p1=cb;sub=num[cb];} } break; case 1: if(num[cb]>=0) { flag=2;p2=cb; add=num[cb]; } else { sub+=num[cb]; } break; case 2: if(num[cb]>=0) { add+=num[cb]; } else { if(add+sub+now<add) { start=p2-1; end=cb-1; now=add; sub=add=0; } else { if(add+sub>0) { end=cb-1; now+=add+sub; sub=add=0; } else { end=p1-1;} } flag=1; sub=num[cb]; p1=cb; } break; } } if(flag==0 && end==0) for(cb=1,start=end=1;cb<=n;cb++) { if(num[cb]>num[start]) { end=start=cb;now=num[start];} } printf("%d %d %d/n",now,start,end); if(ca!=t-1) printf("/n"); } } return 0; } 下面这个代码想法很好,但是没通过 /* 1003nb Max Sum Time Limit : 1000 ms Memory Limit : 32768 K Output Limit : 1024 K GUN C++ */ #include <iostream.h> using namespace std; const int NMAX=100000; int main() { int t,n,ca,cb,i,j,sum,max,now; while(cin>>t) { for(ca=1;ca<=t;ca++) { cin>>n; sum=0;max=-2147483647; for(cb=1;cb<=n;cb++) { cin>>now; sum+=now; if(sum>=0 && max<0) { i=cb;} if(sum>max) { max=sum;j=cb;} if(sum<0) { sum=0;} } cout<<"Case "<<ca<<":/n"<<max<<" "<<i<<" "<<j<<endl; if(ca!=t) cout<<endl; } } return 0; } #include <iostream> using namespace std; /* 思路: 变量start,end分别保存开始位置和结束位置,max保存上一次的最大值,sum表示当前和。 (1)找到sum>=0的值,即为start的值,然后比较sum和max, (2)若sum>max,更新end的值; (3)若sum<0;则令sum=0,从第(1)步重新开始 */ int main() { int T; cin>>T; int i, j, start, end, max, sum, temp; for(i=1; i<=T; i++) { int N; cin>>N; sum = 0; max = -100000000;//让max=-100000000是用来判断 否是第一个使sum>=0的值 ,若是,则将对start赋值 for(j=1; j<=N; j++) { cin>>temp; sum += temp; if(sum < 0) { sum = 0; //若sum<0,不做任何处理,进行下一位操作 } if((sum >= 0) && (max < 0)) { start = j; } if(sum > max) { max = sum; end = j; } } printf("Case %d:/n", i); printf("%d %d %d/n", max, start, end); if(i != T) { printf("/n"); } } }