poj 1505 Copying Books
| Time Limit: 3000MS | Memory Limit: 10000K | |
| Total Submissions: 7053 | Accepted: 2200 |
Description
Once upon a time, there was a theater ensemble that wanted to play famous Antique Tragedies. The scripts of these plays were divided into many books and actors needed more copies of them, of course. So they hired many scribers to make copies of these books. Imagine you have m books (numbered 1, 2 ... m) that may have different number of pages (p1, p2 ... pm) and you want to make one copy of each of them. Your task is to divide these books among k scribes, k <= m. Each book can be assigned to a single scriber only, and every scriber must get a continuous sequence of books. That means, there exists an increasing succession of numbers 0 = b0 < b1 < b2, ... < bk-1 <= bk = m such that i-th scriber gets a sequence of books with numbers between bi-1+1 and bi. The time needed to make a copy of all the books is determined by the scriber who was assigned the most work. Therefore, our goal is to minimize the maximum number of pages assigned to a single scriber. Your task is to find the optimal assignment.
Input
Output
If there is more than one solution, print the one that minimizes the work assigned to the first scriber, then to the second scriber etc. But each scriber must be assigned at least one book.
Sample Input
2
9 3
100 200 300 400 500 600 700 800 900
5 4
100 100 100 100 100
Sample Output
100 200 300 400 500 / 600 700 / 800 900
100 / 100 / 100 / 100 100
题意:m本书,k个人,用/划分k-1个区间,怎样划分使区间最大的和最小。如果有相同的划分,就输出第一个区间最小的,如果第一区间相等,输出第二区间最小的,依次类推。
每个人都必须有一本书复制,每本书都要复制。
分析:用区间dp,dp[i][j]表示前j个人复制i本书,最大时间中最小。用path数组来记录/的位置。
dp[i][j]是枚举第j个人,前j-1个人最小dp[j-1][j-1],则第j个人就要复制sum[j,i],sum[j,i]表示第j本书到第i本书的页数的总和。
j-1个人也可以复制比j-1更多的书,用一个变量v表示前j-1的人获得的书,v可是在j-1和i-1变化,因为必须要留一本给第j个人。
则前j-1个人就是dp[v][j-1],则第j个人复制的书就是sum[v+1,i]表示第v+1本书到第i本书的页数之和。j-1<=v<=i+1,v的变化来求出第j个人最大的时间。在总体dp[i][j]中挑出最小的。
因此状态转移方程: dp[i][j]=min(dp[i][j],max(dp[v][j-1],sum[v+1,i))
1<=i<=m,1<=j<=k&&j<=i,j-1<=v<=i+1
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[][];
int main()
{
int i,t,a[],k,m,j,v,sum[],temp,p,path[];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&k);
sum[]=;
for(i=;i<=m;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];
}
memset(dp,,sizeof(dp));
memset(path,,sizeof(path));//记录的/的路径一定要清零,不然影响下一次的结果。
for(i=;i<=m;i++)
{
for(j=;j<=i&&j<=k;j++)
{
if(j==)
dp[i][j]=sum[i];
else
{
for(v=j-;v<=i-;v++)
{ temp=max(dp[v][j-],sum[i]-sum[v]);
if(dp[i][j]==||dp[i][j]>=temp)
dp[i][j]=temp;
}
}
}
}//dp[m][k]表示前k个人复制前m本书所需要的最大时间中最小.
p=;j=k-;//有k个人只有k-1的标记处。
for(i=m;i>=;i--)
{
p+=sum[i]-sum[i-]; if(p>dp[m][k]||i==j)//p从后面求和,如果p大于dp[m][k],p就可以记录一下,因为每一段
//路径除了那个最大的区间之外相等,其余都小于dp[m][k],i==j是每本书都仅有一个人对应。
{
path[j--]=i+;
p=sum[i]-sum[i-];
}
}
v=;
for(i=;i<m;i++)
{
printf("%d ",a[i]);
if(i+==path[v])
{
printf("/ ");
v++;
}
}
printf("%d\n",a[m]);
}
return ;
}
/*
2
9 3
100 200 300 400 500 600 700 800 900
5 4
100 100 100 100 100
*/
poj 1505 Copying Books的更多相关文章
- 【POJ】1505 Copying Books
此题主要采用DP思路,难点是求解"/",需要考虑划分数量不够的情况,先采用DP求解最优解,然后采用贪心求解slash.防止中间结果出错,使用了unsigned int. #incl ...
- UVa 714 Copying Books(二分)
题目链接: 传送门 Copying Books Time Limit: 3000MS Memory Limit: 32768 KB Description Before the inventi ...
- 抄书 Copying Books UVa 714
Copying Books 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=85904#problem/B 题目: Descri ...
- UVA 714 Copying Books 二分
题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...
- uva 714 Copying Books(二分法求最大值最小化)
题目连接:714 - Copying Books 题目大意:将一个个数为n的序列分割成m份,要求这m份中的每份中值(该份中的元素和)最大值最小, 输出切割方式,有多种情况输出使得越前面越小的情况. 解 ...
- UVA 714 Copying Books 最大值最小化问题 (贪心 + 二分)
Copying Books Before the invention of book-printing, it was very hard to make a copy of a book. A ...
- POJ1505&&UVa714 Copying Books(DP)
Copying Books Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 7109 Accepted: 2221 Descrip ...
- Copying Books
Copying Books 给出一个长度为m的序列\(\{a_i\}\),将其划分成k个区间,求区间和的最大值的最小值对应的方案,多种方案,则按从左到右的区间长度尽可能小(也就是从左到右区间长度构成的 ...
- 【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 ...
随机推荐
- Oracle 9 - 分析undo和snapshot too old错误
什么操作会生成undo INSERT生成的UNDO最少,只要记录新的rowid UPDATE生成的undo多一点,它要记录修改前的数据中的那部分. DELETE生成最多的undo, 因为它要记录整行被 ...
- 华为3C抢购难度
上周小米2S降价到1299买了一个,今天突然想体验一下抢购红米和3C的难度.万一抢到了,拿到手机市场贵100块钱卖掉,然后可以请女神吃个饭~~~哈哈哈哈! 结果确实不怎么好抢.刚刚试了一下3C: 验证 ...
- 利用python 获取 windows 组策略
工作中有时候会有这种需求: 1. 自动配置组策略的安全基线,这个东西不用你自己写了,微软有这个工具,Microsoft Security Compliance Manager,你可以在下面的地址去下载 ...
- Android ListView高度自适应和ScrollView冲突解决
在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,S ...
- JDBC学习总结(一)
1.JDBC概述 JDBC是一种可以执行SQL语句并可返回结果的Java API,其全称是Java DataBase Connectivity,也是一套面向对象的应用程序接口API,它由一组用 ...
- Hadoop HDFS文件常用操作及注意事项(更新)
1.Copy a file from the local file system to HDFS The srcFile variable needs to contain the full name ...
- openfire 介绍安装使用
Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议.Openfire安装和使用都非常简单,并利用Web进行管理.单台服务器可支持上万并发用户.您可以使用 ...
- NDK(14)Native的char*和Java的String相互转换
转自: http://www.cnblogs.com/canphp/archive/2012/11/13/2768937.html 首先确保C/C++源文件的字符编码是UTF-8与JAVA的class ...
- C#获取本机IP以及无线网ip
1 private void GetIP() 2 { 3 string hostName = Dns.GetHostName();//本机名 4 //System.Net.IPAddress ...
- WPF中的Drawing
以前在用WinForm的时候,可以通过GDI+接口在窗体上动态绘制自定义的图形.在WPF中有没有对应的API呢,最近项目中用到了这个,在这里总结一下. WPF中的Drawing主要提供了几类API: ...