二分答案是参数搜索的一个改善。
是这样,对于一个问题,如果它的答案具有单调性质(即如果i不可行,那么大于i的解都不可行,而小于i的解有可能可行),进而用二分的方法枚举答案,再判断答案是否可行,直到求到符合条件为止。
例如:问题的答案范围是1到w之间的一个整数,求最小解,那么我们设s=1,t=w,之后mid=(s+t)整除2。然后判断当解是mid的时候这个问题能不能解决,如果能解决则和最优解比较,并且范围缩小到s到mid-1之间(因为即使这个范围没有解,那么mid是最小解);如果不能解决问题,则最小解肯定比mid要大,则范围缩小到mid+1和t之间。如此反复知道s=t时判断完结束。
这时候那个记录最优解的变量一定记录的是能够达到的最优解。
罗嗦了这么多,简单来说就是假设一个答案,然后判断是否可行,并且不断缩小范围。
二分枚举答案的时间复杂度是O(log2 n),而判断时间是O(K)的话总的时间复杂度是O(Klog2 n)如果某个问题符合这个性质并且K比较小的话这个方法相当实用。

举个例子

k序列和

【问题描述】

对于一个给定的序列,将其分为k个部分,求各部分和的最大值的最小值。

【问题分析】

可采用二分答案的思想,设出一个答案ans,循环将和不超过ans的几个数分为一部分。直到最后若可以分为k部分则减小上界,反之增加下界。直到确定答案。

AYYZOJ 1588

 var
n,k,i,p,l,r,m,s:longint;
a:array[..] of longint;
begin
readln(n,k);
for i:= to n do
begin
read(a[i]);
inc(r,a[i]);
end;
while r-l> do
begin
m:=(l+r) shr ;
s:=; p:=;
for i:= to n do
if s+a[i]<=m then s:=s+a[i]
else begin inc(p); s:=a[i]; end;
if p+>k then l:=m else r:=m;
end;
writeln(r);
end.
// 分。。
原程序输出 r ---->
更改输出为 l+ ---->
原程序循环条件 while r-l> do if p+>k then l:=m else r:=m;
改为 while l<r do if p+>k then l:=m+ else r:=m-; ------>
只改成 while l<r 死循环

收入计划

令我郁闷的是不知上面的程序哪里不对,只有65分。

 var
l,r,mid,n,m,i:longint;
a,b:array[..] of longint;
function check(p:longint):boolean;
var
i,pre,tot:longint;
begin
tot:=m;
pre:=;
i:=;
while i<=n do
begin
if pre+a[i]<=p then
begin
pre:=pre+a[i];
inc(i);
end
else
begin
pre:=;
dec(tot);
if tot= then exit(false);
end;
end;
exit(true);
end;
begin
readln(n,m);
r:=;
for i:= to n do
begin
readln(a[i]);
inc(r,a[i]);
end;
l:=;
while l<r do
begin
mid:=(l+r)>>;
if check(mid) then r:=mid else l:=mid+;
end;
writeln(l);
end.

100

COGS 917 划分序列 

交上同样的程序就过了。。

 var
n,k,i,p,l,r,m,s:longint;
a:array[..] of longint;
begin
assign(input,'seqa.in');
reset(input);
assign(output,'seqa.out');
rewrite(output);
readln(n,k);
for i:= to n do
begin
read(a[i]); inc(r,a[i]);
end;
while r-l> do begin
m:=(l+r) shr ;
s:=; p:=;
for i:= to n do
if s+a[i]<=m then s:=s+a[i]
else begin inc(p); s:=a[i]; end;
if p+>k then l:=m else r:=m;
end;
writeln(r);
close(input);
close(output);
end.

100

k序列和的更多相关文章

  1. Python数据类型之“序列概述与基本序列类型(Basic Sequences)”

    序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要以下几种类型: 3种基本序列类型(Basic Sequence Types):list. ...

  2. LeetCode:60. Permutation Sequence,n全排列的第k个子列

    LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...

  3. python学习笔记(10)--组合数据类型(序列类型)

    序列是具有先后关系的一组数据,是一维元素向量,元素类型可以不同,类似数学元素序列,元素间由序号引导,通过下标访问序列的特定元素.序列类型是一个基类类型,字符串类型,元祖类型,列表类型都属于序列类型. ...

  4. 【转】Python数据类型之“序列概述与基本序列类型(Basic Sequences)”

    [转]Python数据类型之“序列概述与基本序列类型(Basic Sequences)” 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主 ...

  5. codeforces 1262D Optimal Subsequences 主席树询问第k小

    题意 给定长度为\(n\)的序列\(a\),以及m个询问\(<k,pos>\),每次询问满足下列条件的子序列中第\(pos\)位的值为多少. 子序列长度为\(k\) 序列和是所有长度为\( ...

  6. ZOJ 1074 最大子矩阵和

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

  7. codevs 2188 最长上升子序列

    题目描述 Description LIS问题是最经典的动态规划基础问题之一.如果要求一个满足一定条件的最长上升子序列,你还能解决吗? 给出一个长度为N整数序列,请求出它的包含第K个元素的最长上升子序列 ...

  8. Splay POJ3468(老题新做)

    A Simple Problem with Integers Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d ...

  9. 很好的一个dp题目 Codeforces Round #326 (Div. 2) D dp

    http://codeforces.com/contest/588/problem/D 感觉吧,这道题让我做,我应该是不会做的... 题目大意:给出n,L,K.表示数组的长度为n,数组b的长度为L,定 ...

随机推荐

  1. Charles工具内存不足时解决办法

    Charles runs out of memory After recording for a while Charles will run low on available memory. To ...

  2. 特效Shader对雾的处理

    RFX4_Particle.shader案例 #ifdef BlendAdd UNITY_APPLY_FOG_COLOR(i.fogCoord, res, half4(0,0,0,0)); #endi ...

  3. 关于IPointerEnterHandler和IpointerExitHandler的简单说明

    自己在学习UGUI背包系统时用到了,而且遇到一些问题,所以在这里写一下这两个接口的简单说明. 继承IPointerEnterHandler和IpointerExitHandler这两个接口后可以实现两 ...

  4. 【NLP】彻底搞懂BERT

    # 好久没更新博客了,有时候随手在本上写写,或者Evernote上记记,零零散散的笔记带来零零散散的记忆o(╥﹏╥)o..还是整理到博客上比较有整体性,也方便查阅~ 自google在2018年10月底 ...

  5. React Native 之 main.jsbundle生成方法

    通过react-native init yooweiProject 生成的RN项目(版本基于0.57),目录结构如下 项目结构: 大家可以发现main.jsbundle 是红色的,不存在的,这个属于正 ...

  6. 在Gulp中使用BrowserSync

    博客已迁移至http://zlwis.me. 很早就听说过BrowserSync,也看过一些相关文章,可就是没用过.之前一直在用Gulp开发项目,每次编写完Sass后还要用按F5刷新页面看效果,想想也 ...

  7. Final发布中间产物

    目录 ❶版本控制 ❷软件功能说明书 ❸WBS ❹PSP 一.版本控制 ①Git地址:https://git.coding.net/tianjiping/Android-tianjiping.git ② ...

  8. 2-Eighth Scrum Meeting20151208

    任务分配 闫昊: 今日完成:和唐彬讨论研究上届的网络接口代码. 明日任务:商讨如何迁移ios代码到android平台. 唐彬: 今日完成:和闫昊讨论研究上届的网络接口代码. 明日任务:商讨如何迁移io ...

  9. 20162316刘诚昊 Java Queue的测试

    交慢了一步..

  10. 校友聊---Sprint计划会议总结

    1.产品需求及索引卡: 校友聊的软件我们计划分三步进行设计实现功能:文字聊天.语音聊天.视频聊天.首先第一步我们要实现文字聊天这个功能. 经过调研讨论之后,确定了产品的几个需求:在局域网内实现通信要依 ...