把可能的进行二分判断,判断的时候尽量向右取,一直取到不能去为止,这样才有可能成功分割。
判断是否可以把up作为最大值的代码:
bool judge(LL up){ if(up < Big) return false; //Big是数组中最大值,如果up小于最大值是不可能成功划分的 LL sum = 0; int cnt = 0; for(int i = 0; i < n; ){ sum = 0; while(i < n){ sum += a[i]; if(sum <= up) ++i; else break; } ++cnt; } if(cnt <= k) return true; //成功划分 return false; }
值得注意的是,最后得到最小的最大值时应该如何划分,题目要求前面的尽量小,那么就从后面尽可能多的划分,但是不能只满足小于等于up,也要考虑到组成k个序列,不能让某些序列为空。
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int maxn = 500 + 5; int a[maxn], vis[maxn]; int Big = -1; //Biggest number int n,k; //Divid n numbers to k squences bool judge(LL up){ if(up < Big) return false; LL sum = 0; int cnt = 0; for(int i = 0; i < n; ){ sum = 0; while(i < n){ sum += a[i]; if(sum <= up) ++i; else break; } ++cnt; } if(cnt <= k) return true; return false; } LL Binary_Search(LL x, LL y){ //[x,y] while(x < y){ LL mid = x + (y - x) / 2; bool ok = judge(mid); if(ok) y = mid; else x = mid + 1; } return y; } int main(){ int T; scanf("%d", &T); while(T--) { memset(vis, 0, sizeof(vis)); LL sum = 0; Big = -1; scanf("%d%d",&n,&k); for(int i = 0; i < n; ++i){ scanf("%d",&a[i]); sum += a[i]; Big = max(Big, a[i]); } LL up = Binary_Search(1, sum); LL div; int cnt = 0; for( int i = n-1; i >= 0;){ div = 0; while(div <= up && i >= 0 && i + 1 >= k - cnt){ div += a[i]; if(div <= up) --i; } ++cnt; if(i >= 0) vis[i] = 1; } //print the answer for(int i = 0; i < n; ++i){ if(i == n-1) printf("%d\n", a[i]); else printf("%d ", a[i]); if(vis[i]) printf("/ "); } } return 0; }
如有不当之处欢迎指出!
UVA-714 二分的更多相关文章
-
UVa 714 (二分) Copying Books
首先通过二分来确定这种最大值最小的问题. 假设每个区间的和的最大值为x,那么只要判断的时候只要贪心即可. 也就是如果和不超过x就一直往区间里放数,否则就开辟一个新的区间,这样来判断是否k个区间容得下这 ...
-
UVa 714 Copying Books(二分)
题目链接: 传送门 Copying Books Time Limit: 3000MS Memory Limit: 32768 KB Description Before the inventi ...
-
UVa 714 Copying Books - 二分答案
求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...
-
UVA 714 Copying Books 二分
题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...
-
UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)
Copying Books Before the invention of book-printing, it was very hard to make a copy of a book. A ...
-
uva 714 - Copying Books(贪心 最大值最小化 二分)
题目描写叙述开头一大堆屁话,我还细致看了半天..事实上就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,假设最小值同样情况下有多种分配方案,输出前面份数小的,就 ...
-
UVa 714 Copying books 贪心+二分 最大值最小化
题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相 ...
-
UVA 714 Copying Books 抄书 (二分)
题意:把一个包含m个正整数的序列划分成k个非空的连续子序列.使得所有连续子序列的序列和Si的最大值尽量小. 二分,每次判断一下当前的值是否满足条件,然后修改区间.注意初始区间的范围,L应该为所有正整数 ...
-
紫书 例题8-10 UVa 714 (二分答案)
这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案 ...
-
UVA - 714 Copying Books (抄书)(二分+贪心)
题意:把一个包含m个正整数的序列划分成k个(1<=k<=m<=500)非空的连续子序列,使得每个正整数恰好属于一个序列(所有的序列不重叠,且每个正整数都要有所属序列).设第i个序列的 ...
随机推荐
-
Audio 的一些小笔记
1.在做项目的过程中,对于volume 我们有一个volume curve,就是 0~63 step,每个step对应一个dB值,例如0step对应-90dB, 63 step对应0dB.关于这个0d ...
-
如何使用百度音乐搜索接口API
百度有开放音乐搜索的api 比如: http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$ http://b ...
-
Sqli-labs less 39
Less-39 和less-38的区别在于sql语句的不一样:SELECT * FROM users WHERE id=$id LIMIT 0,1 也就是数字型注入,我们可以构造以下的payload: ...
-
让Maven正确处理javac警告
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.1:compile (default ...
-
TCP/IP协议族(一) HTTP简介、请求方法与响应状态码
接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于TCP/IP协议族的,本篇博客就先简单 ...
-
树莓派.安装Samba环境
适用于树莓派3 树莓派装好系统后, 为了方便传文件到树莓派, 建议使用Samba这类文件夹级别的应用, 比ftp方便多了 如果你想把树莓派变成Nas, Samba也是不可或缺的应用 通过samba服务 ...
-
tomcat允许跨域请求:
在springmvc-servlet.xml中配置 <mvc:interceptors> <bean class="com.read.api.pc.interceptor. ...
-
PHP在foreach中对$value赋值无效,应该用 ‘键’ 或者 &;$value的形式
首先我们看下这段代码: foreach ($data as$value) { $value['name'] = 'Hehe'; } $data中原始的数据为: array(1) { [0] => ...
-
TP框架模板中默认值输出
TP框架模板中默认值输出 我们可以给变量输出提供默认值,例如: {$user.nickname|default="这家伙很懒,什么也没留下"} 对系统变量依然可以支持默认值输出,例 ...
-
centos 7使用yum安装docker容器
使用yum命令即可安装 yum install docker 安装完成后,使用下面的命令来启动 docker 服务,并将其设置为开机启动: [root@localhost ~]# systemctl ...