题目链接: http://poj.org/problem?id=3061

题目大意:找到最短的序列长度,使得序列元素和大于S。

解题思路:

两种思路。

一种是二分+前缀和。复杂度O(nlogn)。有点慢。

二分枚举序列长度,如果可行,向左找小的,否则向右找大的。

前缀和预处理之后,可以O(1)内求和。

#include "cstdio"
#include "cstring"
int sum[],n,s,a,T;
bool check(int x)
{
int l,r;
for(int i=;i+x-<=n;i++)
{
l=i,r=i+x-;
if(sum[r]-sum[l-]>=s) return true;
}
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++)
{
scanf("%d",&a);
sum[i]=sum[i-]+a;
}
int l=,r=n,ans=;
while(l<=r)
{
int mid=l+(r-l)/;
if(check(mid)) {ans=mid;r=mid-;}
else l=mid+;
}
printf("%d\n",ans);
memset(sum,,sizeof(sum));
}
}

二分法

另一种是某本著名的日译ACM书介绍的尺取法。复杂度O(n)

这个方法很简单。

①令L=1,先找一下满足要求的第一个长度(当然不一定是最优结果)。期间R++不停伸展。

②满足了是吧,现在踢掉第一个元素,令L++。从第二个元素看起,不符合要求继续伸展R。更新一下ans。继续踢第二个元素。

③踢踢踢,直到不能伸展R,且不符合要求,break。

这种方法只有一个疑问点,就是R不往回移动,其结果一定是对的吗?

考虑一下,L一直向右移动,R其实没必要向左动了。R只有在不满足条件的时候才向右,否则停在原位。

此时凭L的移动已经能找出所有可行的区间了。可以联想一下滑动变阻器,固定R,滑动L。

#include "cstdio"
#include "cstring"
#include "iostream"
using namespace std;
int a[],n,s,l,r,T,sum,ans;
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&s);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
l=,r=,sum=,ans=0x3f3f3f3f;
while(true)
{
while(sum<s&&r<=n) sum+=a[r++];
if(sum<s) break;
ans=min(ans,r-l);
sum-=a[l++];
}
if(ans==0x3f3f3f3f) printf("0\n");
else printf("%d\n",ans);
}
}
13592296 neopenx 3061 Accepted 548K 79MS C++ 593B 2014-11-02 20:53:32

POJ 3061 (二分+前缀和or尺取法)的更多相关文章

  1. poj 2566Bound Found(前缀和,尺取法)

    http://poj.org/problem?id=2566: Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissi ...

  2. poj 3061(二分 or 尺取法)

    传送门:Problem 3061 https://www.cnblogs.com/violet-acmer/p/9793209.html 马上就要去上课了,先献上二分AC代码,其余的有空再补 题意: ...

  3. POJ 3061 Subsequence【二分答案】||【尺取法】

    <题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...

  4. POJ 3320 Jessica's Reading Problem 尺取法

    Description Jessica's a very lovely girl wooed by lots of boys. Recently she has a problem. The fina ...

  5. poj 3320 jessica's Reading PJroblem 尺取法 -map和set的使用

    jessica's Reading PJroblem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9134   Accep ...

  6. POJ 3320 Jessica's Reading Problem 尺取法/map

    Jessica's Reading Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7467   Accept ...

  7. Subsequence poj 3061 二分(nlog n)或尺取法(n)

    Subsequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9236   Accepted: 3701 Descr ...

  8. poj 2566"Bound Found"(尺取法)

    传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...

  9. POJ_3061_Subsequence_(尺取法)

    描述 http://poj.org/problem?id=3061 给定长度为n的数列整数以及整数S.求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0. Subsequence Time ...

随机推荐

  1. 2.2 顺序容器-list

    list(双向链表) 1) *  :包含头文件list **:不支持随机存取:增删元素时间是常数,只需要修改指针 2)成员函数 *  :vector的成员函数list基本都有 **:以下是部分独有成员 ...

  2. Lattice Diamond 的学习之新建工程

    1).打开软件 在软件打开后的初始布局会有一个Start  page 可以创建.打开.导入一个ISPLEVER 工程. 2).建立工程:1,Start page 中Project --> NEW ...

  3. OID View

    http://oid-info.com/get/1.3.6.1.2.1.17.1.4.1.2

  4. Message Flood

    Message Flood Time Limit: 1500MS Memory limit: 65536K 题目描述 Well, how do you feel about mobile phone? ...

  5. python中最简单的多进程程序

    学着.. #!/usr/bin/env python # -*- coding: utf-8 -*- # Spawn a Process: Chapter 3: Process Based Paral ...

  6. hdu 1247:Hat’s Words(字典树,经典题)

    Hat’s Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. PHPCMS 实现上一篇、下一篇

    方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...

  8. zoj 3882 博弈 *

    看了半天约数居然包括1,水了 #include<cstdio> #include<iostream> #include<algorithm> #include< ...

  9. OVER(PARTITION BY)函数用法

    OVER(PARTITION BY)函数介绍 开窗函数               Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...

  10. Liferay 6.2 改造系列之八:修改默认安装的Portlet项目War包

    Liferay默认在Tomcat.Jetty等服务器情况下,自动安装marketplace-portlet-6.2.0.1.war包,实现应用商店的自动部署,一般不需要应用商店,故删除以下包即可: / ...