POJ 3061 (二分+前缀和or尺取法)
题目链接: 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尺取法)的更多相关文章
- poj 2566Bound Found(前缀和,尺取法)
http://poj.org/problem?id=2566: Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissi ...
- poj 3061(二分 or 尺取法)
传送门:Problem 3061 https://www.cnblogs.com/violet-acmer/p/9793209.html 马上就要去上课了,先献上二分AC代码,其余的有空再补 题意: ...
- POJ 3061 Subsequence【二分答案】||【尺取法】
<题目链接> 题目大意: 给你一段长度为n的整数序列,并且给出一个整数S,问你这段序列中区间之和大于等于S的最短区间长度是多少. 解题分析:本题可以用二分答案做,先求出前缀和,然后枚举区间 ...
- 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 ...
- poj 3320 jessica's Reading PJroblem 尺取法 -map和set的使用
jessica's Reading PJroblem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9134 Accep ...
- POJ 3320 Jessica's Reading Problem 尺取法/map
Jessica's Reading Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7467 Accept ...
- Subsequence poj 3061 二分(nlog n)或尺取法(n)
Subsequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9236 Accepted: 3701 Descr ...
- poj 2566"Bound Found"(尺取法)
传送门 参考资料: [1]:http://www.voidcn.com/article/p-huucvank-dv.html 题意: 题意就是找一个连续的子区间,使它的和的绝对值最接近target. ...
- POJ_3061_Subsequence_(尺取法)
描述 http://poj.org/problem?id=3061 给定长度为n的数列整数以及整数S.求出总和不小于S的连续子序列的长度的最小值,如果解不存在输出0. Subsequence Time ...
随机推荐
- hadoop 2.5 hdfs namenode –format 出错Usage: java NameNode [-backup] |
在 cd /home/hadoop/hadoop-2.5.2/bin 下 执行的./hdfs namenode -format 报错[hadoop@node1 bin]$ ./hdfs nameno ...
- max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
在/etc/syscurity/limits.conf 加入以下两行: elastic hard nofile 65536 elastic soft nofile 65536 #备注:elastic ...
- Clr Via C#读书笔记---程序集的加载和反射
#1 加载程序集 Assembly.Load: public class Assembly { public static Assembly Load(AssemblyName assemblyRef ...
- 数据结构和算法 – 11.高级排序算法(下)
三.选择类排序 3.1.简单选择排序 http://www.cnblogs.com/tangge/p/5338734.html#XuanZe 3.2 堆排序 要知道堆排序,首先要了解一下二叉树的模型. ...
- Redis笔记(七)Java实现Redis消息队列
这里我使用Redis的发布.订阅功能实现简单的消息队列,基本的命令有publish.subscribe等. 在Jedis中,有对应的java方法,但是只能发布字符串消息.为了传输对象,需要将对象进行序 ...
- ASP.NET Web Api 服务器端变了,客户端该如何修改请求(转载)
转载地址:http://www.cnblogs.com/fzrain/p/3558765.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现时 ...
- JavaScript - Html 中使用JavaScript
把JavaScript插入到HTML页面要使用<script>元素.使用这个元素可以把JavaScript嵌入到HTML页面中,让脚本与标记混合在一起:也可以包含外部的JavaScript ...
- phpcms v9实现wap单页教程
下面以添加“关于我们”这一单页为例作phpcms V9 wap手机门户添加单页的教程说明: 步骤一:复制phpcms\templates\default\wap下的maps.html,粘贴重命名为ab ...
- Windows下Apache服务器中自动配置二级子域名
今天我们介绍的这个办法,只需要简单修改 httpd-vhosts.conf 文件,配合 .htaccess 文件即可实现自动配置二级域名. 我们这里以 wpchina.com 为例,以下代码中的 wp ...
- 第十七篇:使用窗口的cache属性加速SOUI的渲染
内容渲染速度是决定一个UI成败的关键.无论UI做得多华丽,没有速度都没有意义. 在MFC,WTL等开发框架下,每个控件都是一个窗口,窗口只需要画前景,背景.因为窗口之间的内容不需要做混合,一个子窗口的 ...