**题意:**给定一个序列,使得其和大于或等于S,求最短的子序列长度。
最基本的尺取法
尺取无序数列
这个题目区间和明显是有趋势的:单调变化,所以根据题目要求很容易求解
注意int的范围为21亿,此题不需要long long
#include<algorithm>
#include<iostream>
#define INF 0x3f3f3f3f
using namespace std;
int t, n, s;
int a[100005];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>s;
for(int i = 1; i <= n; i++) cin>>a[i];
int st = 1, en = 1, sum = 0, ans = INF;
for(;;)
{
while(en <= n && sum < s) sum += a[en++];
if(sum < s) break;
ans = min(ans, en-st);
sum -= a[st++];
}
if(ans == INF) ans = 0; //特殊情况的考虑
cout<<ans<<endl;
}
return 0;
}