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

传送门

题意:

给一个长度为n的数列
1 :所有数的和为sum
2 :所有字段和两个正整数 \(l,r(1\leq 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\n",ma);
        if(sum[n]>ma){
            printf("YES\n");
        }
        else
            printf("NO\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zzl-dreamfly/p/12228816.html
今日推荐