该类问题通用描述:
  有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. PriorityQueue 是线性结构吗?90%的人都搞错了!

    文章首发于「陈树义」公众号及个人博客 shuyi.tech 其实这个问题的完整描述是:Java 中的 PriorityQueue 实现,其数据的逻辑结构是线性结构吗?其数据的物理结构又是什么? 估计很 ...

  2. Xshell(远程)连接不上linux服务器(防火墙介绍)

    一.原因 远程(ssh)连接不上linux服务器的大多数原因都是因为本地服务器的防火墙策略导致的,因此我们想ssh远程能够连接上服务器,有两种方法: 修改防火墙策略 关闭防火墙 二.防火墙服务介绍 1 ...

  3. vue 快速入门 系列 —— 虚拟 DOM

    其他章节请看: vue 快速入门 系列 虚拟 DOM 什么是虚拟 dom dom 是文档对象模型,以节点树的形式来表现文档. 虚拟 dom 不是真正意义上的 dom.而是一个 javascript 对 ...

  4. oCPC中转化率模型与校准

    翻看日历时间已经来到了2021年,也是共同战役的第二年,许久没有更新文章了,在与懒惰进行过几次斗争都失利之后,今天拿出打工人最后的倔强,终于收获了一场胜利.闲话不多说,今天咱们重点聊聊oCPC中转化率 ...

  5. [Fundamental of Power Electronics]-PART I-5.不连续导电模式-5.1 DCM来源和模式边界

    引子: 当使用电流单向和/或电压单向半导体开关实现DC-DC变换器的理想开关时,可能会出现一种或多种被称为不连续导电模式(DCM)的新工作模式.当电感电流或电容电压的纹波大到足以导致所施加的开关电流或 ...

  6. windows2003安装php ,mysql,fastgui

    在上一章中,windows2003的iis搭建已经完成,但是我们现在用的多的也包含php,该如何让Windows2003成功使用php文件呢? windows2003需要先行安装vc9运行库才能与fa ...

  7. 解决Linux无法读写U盘中的NTFS问题

    1 问题描述 由于笔者因为某些需要把Windows装在了U盘上面(在这里建议一下如果有需要请使用固态U盘),在Linux下挂载时,能读取但并不能写. 2 尝试的解决方案 2.1 remount 一开始 ...

  8. kubernetes 的API 介绍

    在API conventions doc中描述了API的全部协议. 在API Reference文档中描述了API的端点.资源类型和示例. 在Controlling API Access doc中讨论 ...

  9. kubernetes之pod拓扑分布约束

    在日常使用 kubernetes 的过程中中,很多时候我们并没有过多的关心 pod 的到底调度在哪里,只是通过多副本的测试,来提高的我们的业务的可用性,但是当多个相同业务 pod 在分布在相同节点时, ...

  10. 【C++】从零开始,只使用FFmpeg,Win32 API,实现一个播放器(一)

    前言 起初只是想做一个直接读取视频文件然后播放字符动画的程序.我的设想很简单,只要有现成的库,帮我把视频文件解析成一帧一帧的原始画面信息,那么我只需要读取里面的每一个像素的RGB数值,计算出亮度,然后 ...