Copying Books

给出一个长度为m的序列\(\{a_i\}\),将其划分成k个区间,求区间和的最大值的最小值对应的方案,多种方案,则按从左到右的区间长度尽可能小(也就是从左到右区间长度构成的序列的字典序最小),\(m,k\leq 500\)。

显然最大值的最小值想到二分,其实dp也可以,因为区间划分问题有可递推性,而且它能求出答案。

二分一个东西就等于换时间复杂度增加个\(log(n)\)增加了一个已知条件,虽然前提是单调性,但不妨以后缺少条件,先考虑二分再找单调性。

我们二分\(x\)表示区间和的最大值不超过\(x\),于是二分以后再考虑贪心(说是在的,二分后面的check要么是贪心要么是dp),那么从左往右扫描,处理出一个区间时,不停地在它的右边增加数字,当刚好要超过的时候,就把该个数字划分到下一个区间,显然这样我们得到了一个数字,意思即满足当前条件下最少的区间数。

其实可以看成一个函数\(f(x)\),显然随着x的增大,最少区间数会减少,而x又恰恰对应一个范围\([f(x),n]\),即区间数的范围。

因此当k在这个范围外的时候,显然\(f(x)\)需要减少,即x增加,反之(应该写的是\(lower\_bound\)二分),于是我们就得到了一个最小的x,正好框住k,显然当取比x大的值,同样满足条件,但是结果不优秀,取比x小的又不满足条件,于是x就是答案的"前提"。

于是按照之前的贪心方法,可以得到一个方案,字典序最小,只要从右往左贪心即可,但它是最少的区间数的方案,于是还得随便砍掉一些区间,显然可以随便砍,又要保证字典序最小,于是从左往右扫描,能砍就砍,最终时间复杂度O(mlog(m))。

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define Size 550
using namespace std;
bool b[Size];
int a[Size],m;
il void read(int&);
il int fen(int);
int main(){
//freopen("in","r",stdin);
int lsy;read(lsy);
while(lsy--){
memset(b,0,sizeof(b));
int k,l(0),r(0);read(m),read(k);
for(int i(1);i<=m;++i)
read(a[i]),r+=a[i],l=max(l,a[i]);
int mid;while(l<=r){
mid=l+r>>1;
if(fen(mid)>k)l=mid+1;
else r=mid-1;
}int tot(1);
for(int i(m),j(0);i;--i)
if(j+a[i]<=l)j+=a[i];
else j=a[i],b[i]=1,++tot;
tot=k-tot;
for(int i(1);i<=m;++i)
if(tot&&!b[i])b[i]=1,--tot;
for(int i(1);i<=m;++i){
printf("%d ",a[i]);
if(b[i])printf("/ ");
}
putchar('\n');
}
return 0;
}
il int fen(int x){int ans(1);
for(int i(1),j(0);i<=m;++i)
if(j+a[i]<=x)j+=a[i];
else j=a[i],++ans;
return ans;
}
il void read(int &x){
x^=x;ri char c;while(c=getchar(),c<'0'||c>'9');
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}

Copying Books的更多相关文章

  1. UVa 714 Copying Books(二分)

    题目链接: 传送门 Copying Books Time Limit: 3000MS     Memory Limit: 32768 KB Description Before the inventi ...

  2. 抄书 Copying Books UVa 714

    Copying  Books 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/B 题目: Descri ...

  3. UVA 714 Copying Books 二分

    题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...

  4. poj 1505 Copying Books

    http://poj.org/problem?id=1505 Copying Books Time Limit: 3000MS   Memory Limit: 10000K Total Submiss ...

  5. uva 714 Copying Books(二分法求最大值最小化)

    题目连接:714 - Copying Books 题目大意:将一个个数为n的序列分割成m份,要求这m份中的每份中值(该份中的元素和)最大值最小, 输出切割方式,有多种情况输出使得越前面越小的情况. 解 ...

  6. UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)

      Copying Books  Before the invention of book-printing, it was very hard to make a copy of a book. A ...

  7. POJ1505&amp;&amp;UVa714 Copying Books(DP)

    Copying Books Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 7109 Accepted: 2221 Descrip ...

  8. 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx

    Before the invention of book-printing, it was very hard to make a copy of a book. All the contents h ...

  9. 高效算法——B 抄书 copying books,uva714

    Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description ...

随机推荐

  1. IDA技巧

    3. 用[shift+F12]调出字符串表,再根据这些字符串,查看引用的地方,也可以分析出一些sub_0XXXX函数的功能. 进入import函数内 x查看调用处 jump to xref 跳到引用 ...

  2. numpy 数组中添加新元素

    import numpy as npnew_array = np.empty(shape=[0, 3]) # 3列n行for i in range(10): x = i+1 y = i+2 z = i ...

  3. Python3.5-20190507-廖老师-自我笔记-迭代

    可以使用for x in 数据 的那么 这个数据就是可迭代对象. 通过计算生成下一个值的数据就是生成器 可以使用next(数据) 来计算出下一个值的数据就是迭代器(生成器属于迭代器) -------- ...

  4. webpack 学习1 安装构建项目

    本文中使用的webpack版本是4+,请注意区分 node.js安装 node.js下载地址 选择较低版本的稳定版下载,下载完成后得到的是一个msi文件,点击安装即可 安装完毕以后新建一个文件夹,并在 ...

  5. 【leetcode】940. Distinct Subsequences II

    题目如下: Given a string S, count the number of distinct, non-empty subsequences of S . Since the result ...

  6. 【leetcode】945. Minimum Increment to Make Array Unique

    题目如下: Given an array of integers A, a move consists of choosing any A[i], and incrementing it by 1. ...

  7. PHP curl_pause函数

    curl_pause — 暂停及恢复连接. 说明 int curl_pause ( resource $ch , int $bitmask ) 参数 ch 由 curl_init() 返回的 cURL ...

  8. 低价购买 (动态规划,变种最长下降子序列(LIS))

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. redis-持久化、主从复制、集群

    持久化 RDB.AOF(redis.conf) 主从复制 redis.conf 集群 redis-trib.rb.ruby相见如下链接http://www.cnblogs.com/wuxl360/p/ ...

  10. BZOJ 3585: mex(分块+莫队)

    传送门 解题思路 首先直接莫队是能被卡的,时间复杂度不对.就考虑按照值域先进行分块再进行莫队,然后统计答案的时候就暴力扫所有的块,直到一个块内元素不满,再暴力扫这个块就行了,时间复杂度O(msqrt( ...