Subsequence
Subsequence
https://ac.nowcoder.com/acm/problem/107658
//核心:尺取
//详情见注释;
#include<iostream>
using namespace std;
#define N 100000000 //取一个尽量大的数保证大于个数,用处见下文;
int a[100006];
int main(){
int n;
cin>>n;
while(n--){
int x,y;
cin>>x>>y;
for(int i=0;i<x;i++){
cin>>a[i];
}
int sum=0,l=0,r=0,hu,ans=N,flag=1;//ans初始化为N,就是保证符合条件的个数必小于ans,使ans第一次min比较能进行;
while(l<x){//l为左端点,所以l从最左边开始直到最右边;
while(r<x && sum<y){//while中需要同时满足r<x,并且sum<y,当全部加完都没打到sum也会结束循环,防止超时,开始也因为这个原因wa了
sum+=a[r];
r++;
}//因为尺取,所以上面的r并就留在第一个是sum符合情况的位置不用左移,之后再随着l右移而右移,
if(sum>=y) hu=r-l;//当sum符合条件,更新hu(用来存个数的)
if(l==0&&sum<y)flag=0;//如果全部加起来都小于y,所以没有符合要求的值;
ans=min(ans,hu);//因为求最小所以每个hu来都需要与ans比较ans保留较小值。
sum-=a[l++];//l左移,sum就随之而变化。
}
if(flag==0)cout<<0<<endl;//flag==0代表所有和都小于y没有答案输出0;反之则输出答案;
else cout<<ans<<endl;
}
return 0;
}</iostream>