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

poj3061(尺取法)

时间:2018-07-29 11:51:22      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:closed   iostream   ble   技术   isp   eof   blank   max   efi   

Subsequence

题意:

  给出一个序列,要求找出一个长度最短的连续子区间,满足区间上所有数之和大于等于S,输出这个最短长度。

分析:

  枚举每个点为左端点,用尺取法找到其右端点,取n次结果中的最小值就好了。

代码:

技术分享图片
#include <stack>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))

const int maxn=1e5+100;

int n,T,S;

int a[maxn];

int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&S);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }

        int s=1,e=1;
        int ans=n+1,sum=0;
        while(true)
        {
            while(e<=n&&sum<S)  sum+=a[e++];
            if(sum<S)   break;
            ans=min(ans,e-s);
            sum-=a[s++];
        }
        if(ans==n+1)    ans=0;
        printf("%d\n",ans);
    }
    return 0;
}
View Code

poj3061(尺取法)

标签:closed   iostream   ble   技术   isp   eof   blank   max   efi   

原文地址:https://www.cnblogs.com/shutdown113/p/9384612.html

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