C++尺取法
个人笔记,仅供复习
1.概念:返回推进区间的开头和结尾,求满足条件的最小区间的方法称为尺取法。所谓尺取法,顾名思义,就是像一把尺子(固定某一条件),不断向右(左)移动,不断更新所求答案。一般用来求满足条件的最小区间。
2.实现步骤:
- 初始化左右端点
- 不断扩大右端点,直至满足条件
- 如果直至终点也无法满足条件,则终止,否则更新结果
- 扩大左端点(右移1),跳回步骤2
3.例题:给定一个整数S,求一个长度为n的序列(所有元素均为正整数)中总和不小于S的连续子序列的长度的最小值,如果不存在,则输出0。
3.1 解析:假设输入n=10,s = 15.然后给出一个包含十个元素的数组:5 1 3 5 10 7 4 9 2 8.
3.2 代码实例:
#include<iostream>
const long long inf = 10e8;
using namespace std;
int main()
{
int n,ans = inf;
long long s;
cin >> n >> s;
int a[n];
int b = 0, e = 0,sum = 0;
for(int i = 0;i < n;i++) cin >> a[i];
while(true){
while(e < n && sum < s) sum += a[e++];
if(sum < s) break;
ans = (e-b) < ans?(e-b):ans;
sum -= a[b++];
}
if(ans == inf) ans = 0;
cout << ans << endl;
return 0;
}