二分答案是参数搜索的一个改善。
是这样,对于一个问题,如果它的答案具有单调性质(即如果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. python中变量的数据类型总结

    1.变量的数据类型,分为数值型和非数值型 数值型: int(整型) float(浮点型) bool (布尔型,只有True和Flase) compex(复数型, 用于科学计算) 非数值型: str(字 ...

  2. pytest使用笔记(二)——pytest+allure配置使用

    使用环境及预置条件 开发工具:pycharm 操作系统:win10 开发语言:python3.6 使用库:pytest4.0,pytest-allure-adaptor 注意不要安装allure-py ...

  3. Your requirements could not be resolved to an installable set of packages

    使用composer下载laravel安装程序时(composer global require "laravel/installer"),报截图中的错误. 解决: 根据提示可知, ...

  4. linux shell 完成批量压缩文件

    首先得到文件列表 使用 list -1 注意是1 不是l 然后是用一个循环内包装zip代码 #!/bin/bash list=`` for var in $list do echo $var zip ...

  5. 正则表达式的捕获组(Java)

    捕获组分类 普通捕获组(Expression) 命名捕获组(?<name>Expression) 普通捕获组 从正则表达式左侧开始,每出现一个左括号“(”记做一个分组,分组编号从1开始.0 ...

  6. python3实现合并两个有序数组

    很早就听同学和师兄经常说刷题很重要,然而编程能力一直都很渣的我最近才开始从leetcode的初级算法开始.今天遇到的这道题虽然很简单,因为是头一次用自己的方法速度还不错,特此记录一下,还大神们请不要嘲 ...

  7. WebSocket抓包分析

    转载自:https://www.cnblogs.com/songwenjie/p/8575579.html Chrome控制台 (1)F12进入控制台,点击Network,选中ws栏,注意选中Filt ...

  8. 重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室发表于云+社区专栏 本文经授权转载自 FreeBuf 2018年世界杯硝烟散尽,但关于她的话题却远远没有结束.说起世界杯,就 ...

  9. 为什么HashMap桶(链表)的长度超过8会转换成红黑树?

    百度了一下,感觉能说清楚的并不多,所以在此记录一下. 首先说一说转换为红黑树的必要性: 红黑树的插入.删除和遍历的最坏时间复杂度都是log(n), 因此,意外的情况或者恶意使用下导致hashCode( ...

  10. 2019第十届蓝桥杯C++B组题解(赛后重写的,不确保答案正确性,仅供参考)

    先说一下这次的感受吧,我们考场比较乱,开始比赛了,还有的电脑有故障,(向这些人发出同情),第一次认真参加比赛,真正比赛的时候感觉没有那么正式,很乱,各种小问题,(例如博主就没找到题目在哪里,找到后又不 ...