该类问题通用描述:
  有n个物体,每个物体都有一个权值V[i],现在将n个物体连续分成m个部分,m个部分有一个部分会拿到最多的权值v。求所有分配方式中最小的v。
典型题目:
  分发书本,宠物屋涂色等。
问题分析:
     为便于问题理解,将n个物品权值当成物体体积V,每个物体体积V[i]。分成m个部分表示用m个桶去顺序装这些物品,那么问题就变成了用m个容量相同的桶子去装这些物品,桶子的容量最小可以为多少。如下图所示:
  
  我们设定满足条件的最小桶子容量为target,那么怎么确定target值呢?我们可以先假设桶子容量都为x,然后按顺序将物品放入到桶子中,如果放不下了就放入下一个。如果放满最后一个桶,物品还没放完,那么桶子容量肯定小了,即x < target;如果在放满最后一个桶前,物品放完了,那么桶子容量大了或刚好适合,即x >= target。
  我们接着来确定桶子容量target的范围,target首先要能装任何一个物品,所以target >= max(max指体积最大的物品的体积),同时target <= sum(sum指所有物品的体积和)。
  到了现在我们知道target的范围,也知道如何判断一个数x与target的大小关系。为了减少比较次数,可以使用二分法来找到具体的值。和普通的二分查找不同的是需要通过更多计算(判断容量为x时能否放完全部物品)得到中值与target的大小关系,进而进一步确定范围。
  java版本的实现代码(含注释)如下:
 1 // 相当于有n个物品,每个物品的体积V[i],要使得m个容量相同的桶能按顺序装下所有物品,求出桶的最小容量target
2 public int splitArray(int[] V, int m){
3 // 待求解值target的范围为[max,sum]
4 int max = V[0];
5 int sum = V[0];
6 for (int i = 1; i < V.length; i++) {
7 max = Math.max(max,V[i]);
8 sum += V[i];
9 }
10 // 二分法找到target值
11 int left = max;
12 int right = sum;
13 while (left < right) {
14 int mid = (left+right)/2;
15 // 判断当桶子容量为mid时能否装完所有物品,能装完则target <= mid, 不能装完则target > mid
16 if (isFit(V,mid,m)) {
17 right = mid;
18 } else {
19 left = mid+1;
20 }
21 }
22 return left;
23 }
24 // 判断当桶子容量为x时m个桶子能否装完所有物品,true表示可以装完物品,false表示还没装完
25 public boolean isFit(int[] V, int x, int m) {
26 // 当前桶数
27 int count = 1;
28 // 当前桶被填容量
29 int s = 0;
30 for (int i = 0; i < V.length; i++) {
31 // 没超过一个桶容量就放到该桶
32 if (s + V[i] <= x) {
33 s += V[i];
34 } else {
35 // 超过一个桶容量就把该物品放到下一个桶,并把桶数+1
36 s = V[i];
37 count++;
38 }
39 }
40 // 判断桶数是否超过x,count<=x表示没装完桶子,返回true,count>x表示桶子数不够没装完,返回false
41 if (count <= m)
42 return true;
43 else
44 return false;
45 }
 

OJ最大值最小化问题(分发书本)的更多相关文章

  1. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  2. BUAA1389愤怒的DZY(最大值最小化)

    http://acm.buaa.edu.cn/problem/1389/ 愤怒的DZY[问题描述]“愤怒的小鸟”如今已经是家喻户晓的游戏了,机智的WJC最近发明了一个类似的新游戏:“愤怒的DZY”.游 ...

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

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

  4. hdu 4004 最大值最小化

    http://acm.hdu.edu.cn/showproblem.php?pid=4004 一条线段长度为L,线段上有n个点,最多选取 m-1 个点,使得包括线段端点在内的相邻点之间的最大距离值最小 ...

  5. Crowd Control(输出不在最大值最小化的最短路上的边)

    题意: 就是求完最大值最小化  然后输出在这条最大值最小化的最短路上的点的不在最短路上的边,emm.... 解析: 很明显,先套spfa最大值最小化模板,emm... 在更新d的时候 用一个pre去记 ...

  6. UVa 714 Copying books 贪心+二分 最大值最小化

    题目大意: 要抄N本书,编号为1,2,3...N, 每本书有1<=x<=10000000页, 把这些书分配给K个抄写员,要求分配给某个抄写员的那些书的编号必须是连续的.每个抄写员的速度是相 ...

  7. Monthly Expense(最大值最小化问题)

                                                                                POJ-3273                 ...

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

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

  9. uva 714 - Copying Books(贪心 最大值最小化 二分)

    题目描写叙述开头一大堆屁话,我还细致看了半天..事实上就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,假设最小值同样情况下有多种分配方案,输出前面份数小的,就 ...

随机推荐

  1. Codeforces Round #545 B. Circus

    题面: 传送门 题目描述: 马戏团中一共有N个人(N是偶数),有的人会扮演小丑,有的人会表演杂技.给出每个人会什么,然后按照下列规则把这些人分成两组: 每个人只能在其中一组 两个组的人数相等(也就是把 ...

  2. Python中if __name__ = "__main__"的理解

    通俗的理解__name__ ="__main__"的意思就是:当.py文件被直接运行时,if __name__ = "__main__"之下的代码快将被运行:当 ...

  3. Centos7安装maven详情以及配置

    一.maven安装: 1.获取maven下载地址: 查询maven最新版本地址:https://maven.apache.org/download.cgi 当前最新版本为maven 3.6.3    ...

  4. Spring Boot 轻量替代框架 Solon 1.3.18 发布

    Solon 是一个微型的Java开发框架.项目从2018年启动以来,参考过大量前人作品:历时两年,4000多次的commit:内核保持0.1m的身材,超高的跑分,良好的使用体验.支持:RPC.REST ...

  5. 热更新解决方案--xlua学习笔记

    一.热更新方案简介 在Unity游戏工程中,C#代码(编译型语言)资源和Resources文件夹下的资源打包后都不可以更改,因此这部分内容不能进行热更新,而lua代码(解释型语言)逻辑不需要进行预编译 ...

  6. Jmeter(四十一) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 下篇(详解教程)

    1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了,因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂,就算修改了也是模模糊糊的.更有甚者觉得那是禁地神圣不可轻 ...

  7. [树形DP]没有上司的晚会

    没 有 上 司 的 晚 会 没有上司的晚会 没有上司的晚会 题目描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职 ...

  8. Java8中的默认方法

    作者:汤圆 个人博客:javalover.cc 前言 大家好啊,我是汤圆,今天给大家带来的是<Java8中的默认方法>,希望对大家有帮助,谢谢 文章纯属原创,个人总结难免有差错,如果有,麻 ...

  9. Dynamics CRM调用选择用户弹窗

    在开发Dynamics CRM的部分场景时我们会遇到一些需要去锁定用户的操作,所以就需要使用Javascript把用户的弹窗弹出来.具体做法如下 我们需要拼接一个弹出选择记录框的url Url格式:C ...

  10. 【Java】 6.0 输入,输出和异常处理

    [概述] 就目前而言,我们遇到的"输出"无非就是这个比: System.out.println() 更详细的输入输出会在IO中提到,那么这个笔记就是记录几种常用输入机制 [Scan ...