N个整数组成的循环序列a
1
1,a
2
2,a
3
3,…,a
n
n,求该序列如a
i
i+a
i+1
i+1+…+a
j
j的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a
n−1
n−1,a
n
n,a
1
1,a
2
2这样的序列)。当所给的整数均为负数时和为0。
例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。
第2 - N+1行:N个整数 (-10^9 <= S i i <= 10^9)
6 -2 11 -4 13 -5 -2
20
思路:如果最大值不是在断点处取得的话,那就是和求普通的最大子序列和;如果是最大值是在断点处取得,那就特殊的处理它
#include<cstdio> #include<algorithm> using namespace std; int main() { int n,x,ok; long long sum,s,m,minsum,maxsum; while(scanf("%d",&n)!=EOF) { ok=0; scanf("%d",&x); if(x>0) ok=1; sum=s=m=minsum=maxsum=x; while(--n) { scanf("%d",&x); if(x>0) ok=1; sum+=x; if(s<0) s+=x; else s=x; minsum=min(s,minsum); if(m>0) m+=x; else m=x; maxsum=max(m,maxsum); } maxsum=max(maxsum,sum-minsum);//sum-minsum是特殊处理 if(ok) printf("%lld\n",maxsum); else printf("0\n"); } return 0; }