51Nnod 1050 循环数组最大子段和

来源:互联网 发布:微信连接失败检查网络 编辑:程序博客网 时间:2024/06/02 04:53

分两种情况。

1  不循环,就是按照0--n-1遍历找最大和

2  循环。那么区间肯定是过了起点<n-1并且终点的坐标<起点的坐标。这样终点----起点的坐标这段就是循环数组的最小子段和

然后总和减去这个最小字段和。

判断两种情况的大小


#include<iostream>  #include<queue>  #include<vector>  #include<stack>  #include<algorithm>#include<cmath> #include<set>using namespace std;  const int mod=1e9+7;int main(){int n;cin>>n;int a[500001];long long SUM=0;for(int i=0;i<n;i++){scanf("%d",&a[i]);SUM+=a[i];}long long sum1=0,out1=0;for(int i=0;i<n;i++){if(sum1+a[i]>0){sum1+=a[i]; }else sum1=0;if(sum1>out1) out1=sum1;}long long minn=0,out2=1<<29;for(int i=0;i<n;i++){if(minn+a[i]<0) minn+=a[i];else minn=0;if(minn<out2) out2=minn; }printf("%lld",max(out1,SUM-out2));return 0;}