码迷,mamicode.com
首页 > 其他好文 > 详细

尺取法模板

时间:2016-04-23 01:41:51      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

例题:给定长度为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\n",ans);
}
int main()
{
    scanf("%d",&n);
    for(int i = 0; i<n; i++) scanf("%I64d",&a[i]);
    solve();
    return 0;
}

 

尺取法模板

标签:

原文地址:http://www.cnblogs.com/littlepear/p/5423372.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!