尺取算法 入门+模板+例题

尺取算法 入门+模板+例题

博客推荐

尺取法原理及模板

https://blog.csdn.net/doubleguy/article/details/81265327

一些入门例题

https://blog.csdn.net/lxt_Lucia/article/details/81091597

模板

这里根据题目POJ 3061来具体实现。

题意是说给你一个有数字组成的序列,找出最短的子串(注意:子串是连续的,子序列可以不连续),使得这个子串的和大于等于S,求子串的长度。

思路:使用尺取法来解决。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<stack>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const double esp=1e-6;
const int inf=0x3f3f3f3f;
const int MAXN=1E5+7;
int num[MAXN], n, s;
int main()
{
	int t=0;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d", &n, &s);
		for(int i=0; i<n; i++)
			scanf("%d", &num[i]);
		int ans=inf, lt=0, rt=0, sum=0;
		while(1)
		{
			while(sum < s && rt < n) 
				sum+=num[rt++];
			if(sum<s) break; //根据上边的循环的条件,如果sum<s的话说明已经右边界到头了,但是子序列的和还是小于S,所以就需要跳出循环了。
			ans=min(ans, rt-lt);
			sum-=num[lt++];
		}
		if(ans==inf) ans=0;
		printf("%d\n", ans);
	}

	return 0;
}
posted @ 2020-02-04 11:46  ALKING1001  阅读(388)  评论(0编辑  收藏  举报