Live Archieve 2678 Subsequence

来源:互联网 发布:机械手臂编程难学吗 编辑:程序博客网 时间:2024/05/03 22:09

题意:给你一个长度为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
原创粉丝点击