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

Posted zzl-dreamfly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于Codeforces 1285B Just Eat It!(最大连续字段和)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #613 (Div. 2) B. Just Eat It!

Codeforces Round #613 (Div. 2) B. Just Eat It!

B - Just Eat It!

CodeForces Gym 100685J Just Another Disney Problem (STL,排序)

在haskell中故意定义无限类型

cf gym 101177 J.Just Terraffic!