#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; int max_i=0,min_i=0,ma=0; void max_son(int a[],int len){ int k,k1,sum=0,i1=0,i2=0,flag=0; max_i=0; min_i=0; ma=k=-10000; for(int i=0;i<len;i++){ if(a[i]>k){ k=a[i]; k1=i; } sum+=a[i]; if(sum<0){ sum=0; i1=i+1; } if(sum>ma){ min_i=i1; max_i=i; ma=sum; } } if(ma==0&&min_i==1&&max_i==0){ ma=k; min_i=max_i=k1; } } int main(void) { int m,n,a[100000]={0}; while(cin>>n){ int x=1; while(x<=n){ scanf("%d",&m); for(int i=0;i<m;i++) scanf("%d",&a[i]); max_son(a,m); printf("Case %d:\n%d %d %d\n",x,ma,++min_i,++max_i); if(x!=n) printf("\n"); x++; } } return 0; }
首先遇到的一个问题是TLE 因为我用了c++的标准输入流,对于这个题目它给定的数组大小在0-100000 这意味着要输入很多数 在时间上用c的输入方法更为合适;
还一个问题是没有考虑当全为负数的情况。
还一点便是题目要求每组数据间隔一行,但要注意最后一行不要不能多隔一个
整个算法的思路是:每个数相加直到和sum<0,重新更改虚最小下标为前一位,且sum=0;期间若sum>前一个和max则将最小下标设为虚下表,最大下表设置为当前下标;