POJ 3061 (二分+前缀和or尺取法)

时间:2022-07-02 09:23:14

题目链接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&lpar;前缀和,尺取法&rpar;

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

  2. poj 3061&lpar;二分 or 尺取法&rpar;

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

  3. POJ 3061 Subsequence【二分答案】&vert;&vert;【尺取法】

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

  4. POJ 3320 Jessica&&num;39&semi;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&&num;39&semi;s Reading PJroblem 尺取法 -map和set的使用

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

  6. POJ 3320 Jessica&&num;39&semi;s Reading Problem 尺取法&sol;map

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

  7. Subsequence poj 3061 二分(nlog n)或尺取法&lpar;n&rpar;

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

  8. poj 2566&quot&semi;Bound Found&quot&semi;&lpar;尺取法&rpar;

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

  9. POJ&lowbar;3061&lowbar;Subsequence&lowbar;&lpar;尺取法&rpar;

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

随机推荐

  1. WLAN协议相关协议

    802.11协议 CAPWAP协议: RFC5415:https://tools.ietf.org/html/rfc5415 DTLS握手处理流程: RFC4347DTLS 认证: RFC5246 U ...

  2. em 和 px相互转换

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. springboot使用之二:整合mybatis(xml方式)并添加PageHelper插件

    整合mybatis实在前面项目的基础上进行的,前面项目具体整合请参照springboot使用之一. 一.整合mybatis 整合mybatis的时候可以从mybatis官网下载mybatis官网整合的 ...

  4. 给你完美浪漫的七夕,APICloud送你双人电影票!

    我一直觉得“幸福的感觉” 就像存款 留着以后用 会幸福感爆棚 于是,我一直习惯于等等,再等等 以为那样就会很幸福 直到有一天,突然发现,在我构想的未来中,总是有你 世界那么大,我只在乎你 世界那么长, ...

  5. tty -s &amp&semi;&amp&semi; mesg n

  6. zabbix&lowbar;agent-linux下的安装

    scp 10.25.133.184:/usr/local/zabbix-2.4.1.tar.gz /usr/local 1.为了安全考虑zabbix只使用普通用户运行,假如你当前用户叫ttlsa,那么 ...

  7. RUP 方法简介

    1.什么是RUP: Rational Unified Process(以下简称RUP) 是一套软件工程方法,主要由 Ivar Jacobson的 The Objectory Approch 和 The ...

  8. 爬取字段 spider&lowbar;text

    __author__ = 'sus'import urllibimport urllib2import re def getPage(url):        #获取网页 request = urll ...

  9. 自定义 serializeJSON&lpar;&rpar; 函数

    说明:jQuery框架提供了serialize()方法, 能够将DOM元素内容序列化为json格式字符串,用于ajax请求.通过使用serialize()方法,可以提交本页面的所有域. 但是此方法具有 ...

  10. The declared package does not match the expected package Java

    今天使用vscode 编写java代码做测试时候,发现这个问题,大概总结一下. 目录结构 bao -> Point.java test.java package bao; public clas ...