• 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;
    }
  • 相关阅读:
    解决beego运行程序报错问题:stderr: go: github.com/astaxie/beego@v1.12.1: missing go.sum entry
    Flutter-填平菜鸟和高手之间的沟壑
    百度地图的脑残设计,附上代码,为后来的码农们...
    迅捷Flutter图片浏览软件
    青峰Flutter视频播放软件
    Element UI 自定义Validator
    在C#中如何URL编码和解码
    Postman新手入门
    安装SSDT2017
    layer.prompt 输入值为空的时候点击confirm不能继续
  • 原文地址:https://www.cnblogs.com/Ean1zhi/p/12179901.html
Copyright © 2020-2023  润新知