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