k序列和
二分答案是参数搜索的一个改善。
是这样,对于一个问题,如果它的答案具有单调性质(即如果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序列和的更多相关文章
- Python数据类型之“序列概述与基本序列类型(Basic Sequences)”
序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要以下几种类型: 3种基本序列类型(Basic Sequence Types):list. ...
- LeetCode:60. Permutation Sequence,n全排列的第k个子列
LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...
- python学习笔记(10)--组合数据类型(序列类型)
序列是具有先后关系的一组数据,是一维元素向量,元素类型可以不同,类似数学元素序列,元素间由序号引导,通过下标访问序列的特定元素.序列类型是一个基类类型,字符串类型,元祖类型,列表类型都属于序列类型. ...
- 【转】Python数据类型之“序列概述与基本序列类型(Basic Sequences)”
[转]Python数据类型之“序列概述与基本序列类型(Basic Sequences)” 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主 ...
- codeforces 1262D Optimal Subsequences 主席树询问第k小
题意 给定长度为\(n\)的序列\(a\),以及m个询问\(<k,pos>\),每次询问满足下列条件的子序列中第\(pos\)位的值为多少. 子序列长度为\(k\) 序列和是所有长度为\( ...
- ZOJ 1074 最大子矩阵和
Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...
- codevs 2188 最长上升子序列
题目描述 Description LIS问题是最经典的动态规划基础问题之一.如果要求一个满足一定条件的最长上升子序列,你还能解决吗? 给出一个长度为N整数序列,请求出它的包含第K个元素的最长上升子序列 ...
- Splay POJ3468(老题新做)
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d ...
- 很好的一个dp题目 Codeforces Round #326 (Div. 2) D dp
http://codeforces.com/contest/588/problem/D 感觉吧,这道题让我做,我应该是不会做的... 题目大意:给出n,L,K.表示数组的长度为n,数组b的长度为L,定 ...
随机推荐
- Unity新版本VR以及SteamVR基础
一.Unity2018新版本VR Unity 简单VRDemo搭建 Unity环境搭建: PlayerSetting设置如下: 启动虚拟现实驱动,sdk选择OpenVR.HTC Vive只支持Ope ...
- Python创建虚拟环境
用于创建和管理虚拟环境的模块称为 venv.venv 通常会安装你可用的最新版本的 Python.如果您的系统上有多个版本的 Python,您可以通过运行 python3 或您想要的任何版本来选择特定 ...
- FFmpeg+vs2013开发环境配置(windows)
1.下载ffmpeg包(dll.include.lib) https://ffmpeg.zeranoe.com/builds/ 有3个版本:Static.Shared和Dev St ...
- MySQL(MariaDB)基础之一:编译安装
一.cmake介绍 cmake的重要特性之一是其独立于源码的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译影响,因此在同一个源码树上可以进行多次不同 ...
- vue mock(模拟后台数据) +axios 简单实例(二)
需装上axios,build文件夹中webpack.dev.conf.js文件添加上vue mock配置的东东, 如,继(一) //组件<template> <div> &l ...
- Hyperledger Fabric CA User’s Guide——配置设置(四)
配置设置 Fabric CA提供了三种方案去配置Fabric CA服务端和客户端,优先顺序是: CLI flags(标识) 环境变量 配置文件 在本文档的其余部分中,我们将对配置文件进行更改.但是,可 ...
- Hyperledger Fabric -- gossip 协议
Hyperledger gossip 本文记述了Hyperledger Fabric 中 一种网络数据同步协议--gossip,它的主要作用是致力于账本数据的安全传输,保证不同节点之间状态的同步和 ...
- 如何通过阿里云APP进行域名备案?阿里云备案流程需要多久?
如何通过阿里云APP进行域名备案? 1.准备备案材料(很多初次使用阿里云APP进行备案的同学会问备案需要准备哪些资料,不二版本下面就给大家一一列举出来) 个人备案需要材料: ⑴<用户网站备案授权 ...
- dp算法之有代价的最短路径
题目:有代价的最短路径 题目介绍:如下图所示,现在平面上有N个点,此时N=7,每个点可能和其他点相连,相连的线有一定权值,求出从0点到N-1点的消耗权值的最小值. 分析:用动态规划的思路来解决,每一点 ...
- linux压缩相关
tar命令 tar是打包,即把好多东西放在一个大文件里面,之后再压缩:当然也可以解包 tar的几个参数说明: -c 创建一个新的包 -x 将包里的文件还原出来 -t 显示包内文件的列表 -f 指定要处 ...