之前做过类似的题,思路是:
因为是循环数组,所以分为两种情况,一种是正常的在数组中间的某一段,另一种是头尾相连的那一段,造成第二种情况的原因是中间的这一段是一个很小的数,也就是负数。
想通这一点就很好做了,第一种就是正常求和,得出一个相对大的sum1;第二种求出一个负数和sum2,用sum总-sum2得到一个相对大的和sum3;
最后比较得出ans=max(sum1,sum3);
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> using namespace std; const int maxn=1e5; typedef long long ll; ll a[maxn]; int main(){ int n; ll sum=0,sum1=0,sum2=0,ans=0,num=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%lld",&a[i]); sum+=a[i]; sum1+=a[i]; sum2+=a[i]; num=min(num,sum2); ans=max(ans,sum1); if(sum1<0)sum1=0; if(sum2>0)sum2=0; } printf("%lld",max(ans,sum-num)); }