题目大意:
对于给定长度为 n 的数列整数 a0,a1,...,a(n-1),以及整数S。求出数列中连续的元素的和不小于S的最小长度。
我的理解:
反复推进区间的开头和结尾,来求取满足条件的最小区间的方法,也就是尺取法。
我的代码:
#include <iostream>
#include <cstdio>
#define MAX_N 100005
using namespace std;
int n,S;
int a[MAX_N];
void solve(){
int res = n+1;
int s = 0,t = 0,sum = 0;
while(true){
while(t<n && sum<S){
sum += a[t++];
}
if(sum < S) break;
res = min(res,t-s);
sum -= a[s++];
}
if(res > n){
res = 0;
}
cout<<res<<endl;
}
int main()
{
freopen("D:/OJ/挑战程序设计竞赛/Subsequence.txt","r",stdin);
int T;
cin>>T;
while(T-- != 0){
cin>>n>>S;
for(int i = 0;i<n;i++){
cin>>a[i];
}
solve();
}
return 0;
}