• Codeforces 1285B Just Eat It!(最大连续字段和)


    传送门

    题意:

    给一个长度为n的数列
    1 :所有数的和为sum
    2 :所有字段和两个正整数 (l,r(1leq l leq r leq n)),并算出 (sum_{i=l}^{r} a_i),但是不能(l=1,r=n)
    如果2算出的任意值都严格小于sum,则输出YES,否则输出NO

    思路:

    直接找出来除(l=1,r=n)的所有字段和(sum_{i=l}^{r} a_i)的最大值与sum比较即可

    代码:

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <map>
    #include <queue>
    #include <set>
    using namespace std;
    typedef long long ll;
    const int mod=998244353;
    const int MAXN=2e5+50;
    const double pi=3.1415926536;
    ll dp[MAXN],a[MAXN],sum[MAXN];
    int t,n;
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);sum[0]=0;
            for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            sum[i]=sum[i-1]+a[i];//前缀和
            }
            ll ma=-0x3f3f3f3f3f3f3f3f;
            ll mi=0,mii=0;//mii为前面最小连续和的位置
            for(int i=1;i<n;i++){
                if(mi>sum[i-1]) {
                    mi=sum[i-1];
                    mii=i-1;
                }
                ma=max(ma,sum[i]-mi);
            }
            ll m=0x3f3f3f3f3f3f3f3f;
            if(mii!=0)ma=max(ma,sum[n]-mi);//如果前面最小连续和的位置不为0,即l不是从1开始,可以算l-n的值的和
            else{//找到从2开始的最小值m,算m-n的值的和
                for(int i=1;i<n;i++)
                    m=min(m,sum[i]);
                ma=max(ma,sum[n]-m);
            }
            //printf("%lld
    ",ma);
            if(sum[n]>ma){
                printf("YES
    ");
            }
            else
                printf("NO
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    养成写随笔的习惯
    脚本附加数据库
    脚本还原数据库
    C# 自定义安装包
    怕忘记了。记录一下要采购的元件1
    计划没有变化快啊
    一天三练有点累啊
    nRF24L01无线模块使用1电平转换
    好几年没参加IC公司的研讨会了
    变化
  • 原文地址:https://www.cnblogs.com/zzl_Alexander/p/12228816.html
Copyright © 2020-2023  润新知