首页 > 其他 > 详细

poj3061(尺取法)

时间:2018-07-29 11:09:57      阅读:173      评论:0      收藏:0      [点我收藏+]

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(尺取法)

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!