题意:给定一个序列,找出最短的子序列长度,使得其和大于或等于m。
如果序列和小于m右端点向前推进,r++,如果大于m了说明太大了那么要进行l++,直到推到最后;
//#include<bits/stdc++.h>
#include<algorithm>
#include<stdio.h>
#define ll long long
using namespace std;
ll a[200000];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
int l=0,r=0,min1=0x3f3f3f3f;
ll ans=0;
while(1)
{
while(r<n&&ans<m)ans+=a[r++];
if(ans<m)break;
min1=min(min1,r-l);
ans-=a[l++];
}
if(min1==0x3f3f3f3f)
min1=0;
printf("%d\n",min1);
}
}