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;
}

转载于:https://www.cnblogs.com/long98/p/10352248.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值