zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    石油采集
    石油采集
    Redis 笔记与总结7 PHP + Redis 信息管理系统(用户信息的增删改查)
    数据分析电子商务B2C全流程_数据分析师
    数据分析电子商务B2C全流程_数据分析师
    数据挖掘中分类算法小结_数据分析师
    大数据分析或提升企业税务职能价值
    大数据可视化必须避免的三种常见错误
    大数据可视化必须避免的三种常见错误
    数据分析帮你预知商机
  • 原文地址:https://www.cnblogs.com/Ean1zhi/p/12179901.html
Copyright © 2011-2022 走看看