题面:
题解:由于这题是环形的,最大字段和可能会出现在首尾端相连的情况,这样的情况就是整段序列和减去中间最小的负数端字段和(可将原数组取反求出最大字段和即为原数组最小的负数段字段和)。
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+1000; ll a[N]; int n; ll solve() { ll sum=0; ll ans=0; for(int i=1;i<=n;i++) { if(sum>0) sum+=a[i]; else sum=a[i]; ans=max(ans,sum); } return ans; } int main() { //freopen("1.txt","r",stdin); cin>>n; ll sum=0; for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); sum+=a[i]; } ll ans=solve(); for(int i=1;i<=n;i++) a[i]=-a[i];//取反 cout<<max(ans,sum+solve())<<endl; return 0; }