//
尺取法的明显特征就是求区间长度问题, 从头到尾不断计算
//
两种算法:
1.运用STL
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int vis[maxn];
int sum[maxn];
int main()
{
int n, S;
int T;
cin >> T;
while(T--)
{
memset(vis,0,sizeof(vis));
memset(sum,0,sizeof(sum));
cin >> n >> S;
for(int i =0; i < n; ++i) cin >> vis[i];
for(int i = 0; i < n;++i)sum[i+1] = sum[i] + vis[i];
if(sum[n] < S)
{
cout << "0" << endl;
continue;
}
int res = n;
for(int s = 0; sum[s] + S <= sum[n]; s++)
{
int t = lower_bound(sum+s, sum+n, sum[s] + S) - sum;
res = min(res, t-s);
}
cout << res << endl;
}
}
2.尺取法
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int vis[maxn];
int n, S;
void solve()
{
int res = n + 1;
int s = 0, t = 0, sum = 0;
while(1)
{
while(t<n && sum < S) sum += vis[t++];
if(sum < S) break;
res = min(res, t - s);
sum -= vis[s++];
}
if(res > n) res = 0;
cout << res << endl;
return ;
}
int main()
{
int T;
cin >> T;
while(T--)
{
cin >> n >> S;
for(int i = 0; i < n; ++i) cin >> vis[i];
solve();
}
return 0;
}