题意:给你一个长度为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);
}
}