题目大意:给定一个长度为n的序列,找出一个最短的子序列使其之和大于等于s
我也就来摸摸鱼,尺取+前缀和
弄一个双指针分别对前缀进行处理
sum[i]代表前i项之和 要求i-j的子序列 只需要sum[j]-sum[i-1]即可
接下来只要运用尺取法 在保证当前子序列之和大于等于s的情况下移动左指针
一旦小于移动右指针,这样就可以比较每个满足的区间
#include <iostream>
using namespace std;
const int maxn=5e5+7;
const int inf=0x3f3f3f3f;///防大数
int a[maxn];
int b[maxn];
int main()
{
int t;
cin>>t;
while (t--)
{
int n,m;
cin>>n>>m;
for (int i=1;i<=n;++i)
{
cin>>a[i];
b[i]=b[i-1]+a[i];///前缀
}
int l=1;
int r=1;
int ans=inf;
while (r<=n)///边界条件
{
if (b[r]-b[l-1]>=m)
{
ans=min((r-l+1),ans);///比较当前满足的子序列
++l;
}
else ++r;
}
if (ans==inf)
cout<<0<<endl;
else
cout<<ans<<endl;
}
}



京公网安备 11010502036488号