//
尺取法的明显特征就是求区间长度问题, 从头到尾不断计算
//
两种算法:
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; }