首先介绍一下尺取法:
反复的推进区间的开头和结尾,来求取满足条件的最小区间的方法被称为尺取法
给定长度为n的数列整数a0,s1,……,an-1以及整数S。求出总和不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。
限制条件:
10 < n < 
0 < ai <= 
S < 
输入:
输出:
思路:
在[s, t) 区间上的和小于S的前提下,反复的执行 先不断向右扩充右边界,再不断缩短左边界
#include<iostream>
using namespace std;
const int MAX_N = 1e5;
int n, S;
int a[MAX_N];
void solve(){
int res = n + 1;
int s = 0, t = 0, sum = 0;
for(;;){
while(t < n && sum < S){
sum += a[t++];
}
if(sum < S) break;//整个数组的值加完sum仍然小于S,说明解不存在
res = min(res, t - s);
sum -= a[s++];
}
if(res > n){
res = 0;
}
cout << res;
}
int main(){
cin >> n >> S;
for(int i = 0;i < n;i++){
cin >> a[i];
}
solve();
return 0;
}