C++尺取法

个人笔记,仅供复习

1.概念:返回推进区间的开头和结尾,求满足条件的最小区间的方法称为尺取法。所谓尺取法,顾名思义,就是像一把尺子(固定某一条件),不断向右(左)移动,不断更新所求答案。一般用来求满足条件的最小区间。

2.实现步骤:

  1. 初始化左右端点
  2. 不断扩大右端点,直至满足条件
  3. 如果直至终点也无法满足条件,则终止,否则更新结果
  4. 扩大左端点(右移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;
}

posted @ 2018-05-15 20:21  Dr_Lo  阅读(307)  评论(0编辑  收藏  举报