51NOD 1050

之前做过类似的题,思路是:

因为是循环数组,所以分为两种情况,一种是正常的在数组中间的某一段,另一种是头尾相连的那一段,造成第二种情况的原因是中间的这一段是一个很小的数,也就是负数。

想通这一点就很好做了,第一种就是正常求和,得出一个相对大的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));
}

猜你喜欢

转载自www.cnblogs.com/precious-LZY/p/10072730.html