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

POJ3061 尺取法

时间:2016-08-18 21:24:48      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:从给定序列里找出区间和大于等于S的最小区间的长度。

 

前阵子在zzuli OJ上见过类似的题,还好当时补题了。尺取法O(n)

的复杂度过掉的。尺取法:从头遍历,如果不满足条件,则将尺子尾

部增加,若满足条件,则逐渐减少尺子头部直到不满足条件为止,保存

尺子长度的最小值(尾部-头部+1)即可。

理论上累计区间和+二分查找的暴力也能过。

 

代码如下:

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
#define oo 0x3f3f3f3f
int n, nums[110000], S;
int LIS()
{
    int l = 1, r;
    int ans = oo;
    int sum = 0;
    for(int i=1; i<=n; i++)
    {
        sum += nums[i];
        r = i;
        while(sum>=S)
        {
            ans = min(ans, r-l+1);
            sum-=nums[l];
            l++;
        }
    }
    return ans;
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d %d", &n, &S);
        for(int i=1; i<=n; i++)
            scanf("%d", &nums[i]);
        int ans = LIS();
        if(ans==oo)printf("0\n");
        else printf("%d\n", ans);
    }
    return 0;
}

 

POJ3061 尺取法

标签:

原文地址:http://www.cnblogs.com/zznulw/p/5785231.html

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