题目大意:给定一个长度为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;
   }
}