尺取算法 入门+模板+例题
博客推荐
尺取法原理及模板
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
", ans);
}
return 0;
}