51nod-【循环数组最大子段和】

来源:互联网 发布:北京seo排名优化公司 编辑:程序博客网 时间:2024/05/12 11:43


个代码是ac的但是下面的代码是wa的,希望有人解答,言归正传,
其实对于循环数组的最大子序列的和,只有2种情况  1、最大子序列没有出现首尾相接,直接按照正常方
法做  2、如果首尾相接,我们可以反过来想既然总和是定值,我们假设已经知道首尾相接最大子序列的
和,那剩下的肯定是最小的,并且是在序列的中间,我们直接求出最小值,然后用总和-最小值
不就出来了吗??@_@ 

ac

#include<cstdio>#define inf 0x3f3f3f3flong long num[50000+11];long long max1(long long a,long long b){if(a>b)return a;return b;}int main(){int n;scanf("%d",&n);long long sum=0;for(int i=1;i<=n;++i){scanf("%lld",&num[i]);sum+=num[i];}long long sum2=0,max=-inf;for(int i=1;i<=n;++i){sum2+=num[i];if(sum2>max)max=sum2;if(sum2<0)sum2=0;}long long min=inf,min2;for(int i=1;i<=n;++i){min2+=num[i]; if(min2<min)min=min2;if(min2>0)min2=0;}printf("%lld\n",max1(max,sum-min));return 0; } 

wa

#include<cstdio>#define inf 0x3f3f3f3f __int64 num[50000+11];int main(){__int64 n;scanf("%I64d",&n);for(int i=1;i<=n;++i){scanf("%I64d",&num[i]);num[n+i]=num[i];}__int64 i,sum=0,max=-inf,count;for(i=1;i<=n;++i){count=1;sum=0;for(int j=i;count<=n;++j,++count){sum+=num[j];if(sum>max)max=sum;if(sum<0)sum=0;}}printf("%I64d\n",max); return 0;}


0 0
原创粉丝点击