尺取法模板

例题:给定长度为n的数列整数a0,a1,a2,a3 ..... an-1以及整数S。求出综合不小于S的连续子序列的长度的最小值。如果解不存在,则输出0。

第一组样例   n=10, S = 15, a = {5,1,3,5,10,7,4,9,2,8}。

尺取法步骤:

1.初始化左定点为0.

2.扩充右定点直到满足条件。

3.如果不满足,跳出。

4.将左定点扩大1,回到2条件。

#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[100005];
int n;
void solve(){
    ll s,sum = 0;
    int t = 0;
    cin>>s;
    int cur = 0,ans = n+1;
    while(1){
        while(t<n&&sum<s){
            sum += a[t++];
        }
        if(sum < s) break;
        ans = min(ans,t-cur);
        sum -= a[cur];
        cur++;
    }
    if(ans > n) ans = 0;
    printf("%d
",ans);
}
int main()
{
    scanf("%d",&n);
    for(int i = 0; i<n; i++) scanf("%I64d",&a[i]);
    solve();
    return 0;
}
原文地址:https://www.cnblogs.com/littlepear/p/5423372.html