POJ3061——Subsequence(尺取法)
Subsequence
给定长度为n的数列整数a0,a1,a2…an-1以及整数S。求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0。
反复推进区间的开头和末尾,来求取满足条件的最小区间的方法称为取尺法。
#include <cstdio> #include <iostream> #include <cmath> #include <algorithm> #include <string> #include <cstring> #include <vector> #include <queue> // #define _ ios::sync_with_stdio(false) // #define cin.tie(0) using namespace std; // #define rep(i,x,y) for(int i=x;i<y;i++) typedef long long ll; const int MAXN=2e5+5; int main() { int t,n,s; int a[MAXN]; cin>>t; while(t--) { cin>>n>>s; for(int i=0;i<n;i++) cin>>a[i]; int res=n+1; for(;;) { while(t<n&&sum<s) sum+=a[t++]; if(sum<s) break; res=min(res,t-i); sum-=a[i++]; } if(res>n) res=0; cout<<res<<endl; } return 0; }