Live Archieve 2678 Subsequence

题意:给你一个长度为n的序列和一个数m,每个数都是正数,求出一对i,j使得sum[i...j]>=m并且j-i+1最小,并输出这个最小值


首先我们想到的是枚举i,j然后依次判断,但是显然时间复杂度为O(n^2)

有经验的话会知道只需枚举终点或者起点中的一个就可以了,我们选择枚举终点

设前缀和为sum,那么对于终点j我们需要找到一个尽量大的i使得sum[j]-sum[i-1]>=m

那么我们就在枚举每一个j的时候维护这个i的最大值就可以了,当sum[j]-sum[i]>=m时i++

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=1e5+5,inf=0x3f3f3f3f;
inline void _read(int &x){
    char t=getchar();bool sign=true;
    while(t<'0'||t>'9')
    {if(t=='-')sign=false;t=getchar();}
    for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0';
    if(!sign)x=-x;
}
int n,s[maxn],m,sum[maxn],ans;
int main(){
	int i,j;
	while(scanf("%d%d",&n,&m)!=EOF){
		ans=inf;
		for(i=1;i<=n;i++){
			_read(s[i]);
			sum[i]=sum[i-1]+s[i];
		}
		i=1;
		for(j=1;j<=n;j++){
			if(sum[i-1]>sum[j]-m)continue;
			while(sum[i]<=sum[j]-m)i++;
			ans=min(ans,j-i+1);
		}
		printf("%d\n",ans==inf?0:ans); 
	}
} 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值