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

来源:互联网 发布:淘宝为什么屏蔽神武 编辑:程序博客网 时间:2024/05/22 13:51

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050

#include<cstdio>// 两种情况:1.最大和出现在1~n之间。2.最大和出现在首尾相接处 #include<queue>//  出现2的情况时由于序列中间部分的数值偏小 #include<iostream>#include<vector>#include<map>#include<cstring>#include<string>#include<set>#include<stack>#include<algorithm>#define cle(a) memset(a,0,sizeof(a))#define inf(a) memset(a,0x3f,sizeof(a))#define ll long long#define Rep(i,a,n) for(int i=a;i<=n;i++)using namespace std;const int INF = ( 2e9 ) + 2;const ll maxn = 5e4+10;int a[maxn];ll Get(int n){    ll ret=0,sum=0;    for(int i=0; i<n; i++)    {        if(sum<0)sum=0;        sum+=a[i];        if(ret<sum)ret=sum;    }    return ret;}int main(){    int n;    scanf("%d",&n);    ll sum=0;    for(int i=0; i<n; i++)    {        scanf("%d",&a[i]);        sum+=a[i];    }    ll sum1=Get(n);    for(int i=0; i<n; i++)        a[i]=-a[i];    printf("%lld\n",max(sum+sum2,sum1));}