codeforces_1285B

题目讲的是给一组数据,X得到的所有数据之和,Y得到的是一个区间的总和,但这个区间不能是[1,n];要求如果X大于Y就输出YES 反之 NO

这种题目如果不想麻烦就从[1,n-1]和[2,n]求最大值。

求连续区间最大值的方法就是建一个新的数组,下标i代表这以i为结尾的连续区间的最大值。

则 maxn[i]=max(0,maxn[i-1]+a[i]);即可。

以下为代码

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
long long a[100200];
long long maxn[100200];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        long long tot=0;
        memset(a,0,sizeof(a));
        memset(maxn,0,sizeof maxn);
        long long mannn=-99999999;
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            tot+=a[i];
        }
        for(int i=1;i<=n-1;i++){
            maxn[i] = max((long long)0,maxn[i-1] + a[i]);
            if(maxn[i]>mannn)
                mannn=maxn[i];
        }
        memset(maxn,0,sizeof maxn);
        for(int i=2;i<=n;i++){
            maxn[i] = max((long long)0,maxn[i-1] + a[i]);
            if(maxn[i]>mannn)
                mannn=maxn[i];
        }
        if(mannn>=tot)cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}

这样就能过了,但是这道题真的需要这么做嘛?

有没有想过,当maxn[i]如果为0的时候就已经代表要输出no了。

因此

#include<iostream>
#include<queue>
#include<string>
#include<cstring>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
long long a[100200];
long long maxn[100200];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        long long l,r;
        l=r=0;
        memset(a,0,sizeof(a));for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
        }
        int f=0;
        for(int i=1;i<=n;i++){
            l+=a[i];
            r+=a[n-i+1];
            if(l<=0||r<=0){//代表有个连续区间的和为非正数
                f=1;
            }
        }
        if(f==1)puts("NO");
        else puts("YES");
    }
    return 0;
}
posted @ 2020-01-11 14:52  Ean1zhi  阅读(184)  评论(0编辑  收藏  举报