uva 714 - Copying Books(贪心 最大值最小化 二分)
题目描写叙述开头一大堆屁话,我还细致看了半天。。事实上就最后2句管用。意思就是给出n本书然后要分成k份,每份总页数的最大值要最小。问你分配方案,假设最小值同样情况下有多种分配方案,输出前面份数小的,就像字典序输出从小到大一样的意思。
这里用到贪心的方法,定义f(x)为真的条件是满足x为最大值使n本书分成k份,那么就是求x的最小值。怎样确定这个x就是用的二分法,x一定大于0小于全部值的合,不断的二分再推断是否成立,成立就取左半边,不成立说明太小了就取右半边,写的时候还是没有把二分法理解透彻,我还怕会丢失那个值还特意去保存,其实二分法最后结束得出来的x或y(二个数是相等的)就是每份的最大值。而怎样确定这个最大值是否成立就是用贪心的方法,尽量的往右边拓展直到大于最大值的前一个为止。假设份数还没分完就到最后一个了,那就肯定是成立的。反之,假设份数分完了还没到最后一个那就是不成立。
输出的时候还得注意,得从后往前,由于前面的份数得要小,就得从后往前贪心,还有当剩余的跟份数一样的时候就不能贪心了,就要每个都要分开了。这个就自己模拟数据看吧,加一减一的都得跟前面写的有关系。
还有两点要特别注意, 求和的时候会超int范围,由于一个最大可达1×10^8,而最多有500个,超过了4×10^9了。所以要用long long。另一点是输出的时候最后一个数字后面不能多打一个空格不然会报PE的。
AC代码:
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<ctime>
using namespace std;
#define NMAX 505
#define ll long long
int a[NMAX];
int ans[NMAX];
int solve(ll Max,int n,int k)
{
int i=0,j=0,nct=0;
ll sum=0;
while(nct < k)
{
sum+=a[j];
if(sum > Max && i == j) return 0;
if(sum > Max)
{
nct++;
i = j;
sum = 0;
}
else j++;
if(j == n) return 1;
}
return 0;
} void path(ll Max,int n,int k)
{
int nct = 0,i=n-1;
ll sum=0;
while(i>0)
{
sum+=a[i];
if(sum > Max)
{
sum = 0;
ans[i] = 1;
nct++;
}
else i--;
if(i == k-nct-2)
{
for(int j = 0; j <= i; j++)
ans[j] = 1;
break;
}
}
for(int i = 0; i < n; i++)
{
if(i == n-1) printf("%d",a[i]);
else printf("%d ",a[i]);
if(ans[i]) printf("/ ");
}
printf("\n");
} int main()
{
int i,n,k,m;
scanf("%d",&n);
while(n--)
{
memset(ans,0,sizeof(ans));
scanf("%d%d",&m,&k);
ll sum = 0;
for(i = 0; i < m; i++)
{
scanf("%d",&a[i]);
sum += a[i];
}
ll x=0,y=sum,z;
while(x<y)
{
z = x+(y-x)/2;
if(solve(z,m,k))
y = z;
else x = z+1;
}
path(x,m,k);
}
return 0;
}
uva 714 - Copying Books(贪心 最大值最小化 二分)的更多相关文章
- UVa 714 Copying books 贪心+二分 最大值最小化
		
题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相 ...
 - UVA - 714 Copying Books (抄书)(二分+贪心)
		
题意:把一个包含m个正整数的序列划分成k个(1<=k<=m<=500)非空的连续子序列,使得每个正整数恰好属于一个序列(所有的序列不重叠,且每个正整数都要有所属序列).设第i个序列的 ...
 - 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(二分法求最大值最小化)
		
题目连接:714 - Copying Books 题目大意:将一个个数为n的序列分割成m份,要求这m份中的每份中值(该份中的元素和)最大值最小, 输出切割方式,有多种情况输出使得越前面越小的情况. 解 ...
 - UVa 714 Copying Books(二分)
		
题目链接: 传送门 Copying Books Time Limit: 3000MS Memory Limit: 32768 KB Description Before the inventi ...
 - UVA 714 Copying Books 二分
		
题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...
 - UVa 714 Copying Books - 二分答案
		
求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...
 - UVA 714 Copying Books 抄书 (二分)
		
题意:把一个包含m个正整数的序列划分成k个非空的连续子序列.使得所有连续子序列的序列和Si的最大值尽量小. 二分,每次判断一下当前的值是否满足条件,然后修改区间.注意初始区间的范围,L应该为所有正整数 ...
 - 【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 ...
 
随机推荐
- go - 复合类型 array, slice, map
			
Go 语言支持复合类型: 数组:array 切片:slice 指针:pointer 字典:map 通道:chan 结构体:struct 接口:interface 1. array 同一类型数据的集 ...
 - Query获取值常用
			
Query获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...}); //为Sel ...
 - UML学习-活动图创建
			
活动图(Activity Diagram)可以实现对系统动态行为的建模,主要是将用例细化,即用例内部的细节可以以活动图的方式描述.活动图描述活动的顺序,主要表活动之间的控制流,是内部处理驱动的流程,在 ...
 - C# Winform WindowsMediaPlayer控件
			
要做一个视频无缝切换的程序,所谓无缝就是在一个视频结束时立即开始另一个视频,中间不要有切换的黑屏 实现思路是放两个wmp播放控件,其中每个时刻只有一个在播放,另外一个处于暂停状态,并隐藏 当一个视频播 ...
 - flex 调用WebService2(基于.net)
			
flex 访问WebService的方法有很多种,使用FLEX4中的"数据/服务"功能可以自动生成访问WebService的代理类,这样可以避免把所有的数据访问都写到MXML页面上 ...
 - Byte、KB、MB、GB、TB、PB、EB是啥以及它们之间的进率
			
它们是存储单位 因为计算机存储单位一般用B,KB.MB.GB.TB.PB.EB.ZB.YB.BB来表示,它们之间的关系是: 位 bit (比特)(Binary Digits):存放一位二进制数,即 0 ...
 - 1218.3——init自定义
			
相当于构造方法,有的时候初始化的时候有一些默认值,还有就是页面加载数据的时机问题,防止加载了页面再填数据 声明: -(instancetype)initWithName:(NSString *)aNa ...
 - 【转载】"library not found for - "解决办法
			
[摘要:正在我们编译的时间偶然候会报那个毛病"library not found for - " 因为是我们正在项目中应用了一些第三圆的库,便比方我再应用百度的静态库文件的时间,报 ...
 - 循环小数 UVa202
			
输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度. 例如,a=5,b=43,小数表示为0.(1162790697674418 ...
 - ElasticSearch入门知识扫盲
			
ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...