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>
 查看3道真题和解析
查看3道真题和解析