Description
Input
Output
Sample Input
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
Sample Output
Case 1: 14 1 4 Case 2: 7 1 6
题意很简单,就是求最大的字段和,但是如果按照思路写出来的程序一定会时间超限,所以要想办法优化代码,简化时间,有两种办法,但思路都是差不多的!
第一种:
#include<stdio.h> #include<string.h> int main() { int t,n,a,i,j,s,x,y,m,c=1; scanf("%d",&t); while(t--) { if(c!=1) printf("\n"); scanf("%d%d",&n,&a); s=m=a; //最大值和初始值都赋值为第一个数 x=y=j=1;//坐标都初始为1 for(i=2; i<=n; i++) { scanf("%d",&a); if(s+a<a) //如果加上a还不如不加,那就从此位置重新开始 { s=a; j=i; //重新定初值和起始位置 } else s+=a; //如果不是的话,继续向前加 if(s>m) //随时更新最优解 { m=s; x=j; y=i; } } printf("Case %d:\n%d %d %d\n",c++,m,x,y); } return 0; }第二种:
#include<stdio.h> #include<string.h> int main() { int t,n,a,i,j,s,x,y,m,c=1; scanf("%d",&t); while(t--) { if(c!=1) printf("\n"); scanf("%d",&n); s=0; m=-1010; j=1;//坐标都初始为1 for(i=1; i<=n; i++) { scanf("%d",&a); s+=a; //如果不是的话,继续向前加 if(s>m) //随时更新最优解 { m=s; x=j; y=i; } if(s<0) { s=0; j=i+1; } } printf("Case %d:\n%d %d %d\n",c++,m,x,y); } return 0; }