#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尺取法
最新推荐文章于 2023-09-06 13:42:00 发布
本文介绍了一种解决特定子序列求和问题的高效算法。该算法通过尺取法实现,能够在O(n)的时间复杂度内找出最小子序列,使得该子序列的元素之和大于或等于给定值S。文章提供了完整的C++代码实现,并详细解释了算法的工作原理。
299

被折叠的 条评论
为什么被折叠?



