#include <iostream>
#include <algorithm>
using namespace std;
const int M=101000;
int a[M];
int main()
{
int t;
cin>>t;
while(t--)
{
long long sum=0,S;
int ans=100100;
int n;
cin>>n>>S;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
if(sum<S)
{
cout<<0<<endl;
continue;
}
sum=0;
int s=0,t=0; // As...At-1>=s t为成立中最小一个 ,则As+1...At-2<As...At-2<S 若As+1.....At'-1成立 可以得出 t'>=t
while(1)//t最多变化n次 复杂度为O(n)
{
while(t<n && sum<S) //找到以as开头subsequnce的最小t
{
sum+=a[t];
t++;
}
if(sum<S) break;
ans=min(ans,t-s);
sum-=a[s++];// 尺取到As+1
}
cout<<ans<<endl;
}
return 0;
}
poj 3061 Subsequence尺取法
最新推荐文章于 2020-05-15 18:07:40 发布