标签:vector type span 代码 最大连续 ring 不能 最小值 can
给一个长度为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;
}
Codeforces 1285B Just Eat It!(最大连续字段和)
标签:vector type span 代码 最大连续 ring 不能 最小值 can
原文地址:https://www.cnblogs.com/zzl-dreamfly/p/12228816.html