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

半城伤御伤魂 提交于 2020-02-04 12:22:09

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

博客推荐

尺取法原理及模板

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!