【精】LintCode领扣算法问题答案:437. 书籍复印
437. 书籍复印
描述
给定 n 本书, 第 i 本书的页数为 pages[i]. 现在有 k 个人来复印这些书籍, 而每个人只能复印编号连续的一段的书, 比如一个人可以复印 pages[0], pages[1], pages[2], 但是不可以只复印 pages[0], pages[2], pages[3] 而不复印 pages[1].
所有人复印的速度是一样的, 复印一页需要花费一分钟, 并且所有人同时开始复印. 怎样分配这 k 个人的任务, 使得这 n 本书能够被尽快复印完?
返回完成复印任务最少需要的分钟数.
- 书籍页数总和小于等于2147483647
样例 1:
输入: pages = [3, 2, 4], k = 2
输出: 5
解释: 第一个人复印前两本书, 耗时 5 分钟. 第二个人复印第三本书, 耗时 4 分钟.
样例 2:
输入: pages = [3, 2, 4], k = 3
输出: 4
解释: 三个人各复印一本书.
挑战
时间复杂度 O(nk)
原题传送门
文章目录
- 437. 书籍复印
- 描述
- 样例 1:
- 样例 2:
- 挑战
- 题解
- 最后说两句
- 声明
题解
public class Solution {/*** @param pages: an array of integers* @param k: An integer* @return: an integer*/public int copyBooks(int[] pages, int k) {// write your code here// 最多就是一个人复印完,所以需要所有页数之和int max = 0;// 最少的情况是每个人复印一本,所以最少需要花费那本页数最大的时间int min = 0;for (int page : pages) {max += page;min = Math.max(min, page);}// 根据人数可以算出平均复制页数,或者说平均花费时间,而最终无论怎么分配,时间至少等于平均时间min = Math.max(min, (max + k - 1) / k);// 二分查找法找到最佳点int low = min;int high = max;while (low <= high) {int mid = (low + high) >>> 1;boolean ok = true;// 贪心算法计算按照给定时间至少需要几个人int time = mid;// 需要人数int ps = 1;for (int page : pages) {if (page > time) {time = mid;++ps;if (ps > k) {ok = false;break;}}if (page < time) {time -= page;}}if (ok) {high = mid - 1;} else {low = mid + 1;}}return low;}
}
最后说两句
非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~
作者水平有限,如果文章内容有不准确的地方,请指正。
希望小伙伴们都能每天进步一点点。
声明
本文由二当家的白帽子博客原创,转载请注明来源,谢谢~
【精】LintCode领扣算法问题答案:437. 书籍复印相关推荐
- 【精】LintCode领扣算法问题答案:入门
文章目录 23. 判断数字与字母字符 描述 题解 25. 打印X 描述 题解 37. 反转一个3位整数 描述 题解 145. 大小写转换 描述 题解 366. 斐波纳契数列 描述 题解 454. 矩阵 ...
- 【精】LintCode领扣算法问题答案:1029. 寻找最便宜的航行旅途(最多经过k个中转站)
1029. 寻找最便宜的航行旅途(最多经过k个中转站) 描述 有n个城市被一些航班所连接.每个航班 (u,v,w) 从城市u出发,到达城市v,价格为w. 给定城市数目 n,所有的航班flights.你 ...
- 【精】LintCode领扣算法问题答案:1084. “马”在棋盘上的概率
1084. "马"在棋盘上的概率 描述 已知一个 NxN 的国际象棋棋盘,棋盘的行号和列号都是从 0 开始.即最左上角的格子记为 (0, 0),最右下角的记为 (N-1, N-1) ...
- 【精】LintCode领扣算法问题答案:306. 商品列表
306. 商品列表: 有一个商品列表,该列表是由L1.L2两个子列表拼接而成.当用户浏览并翻页时,需要从列表L1.L2中获取商品进行展示.展示规则如下: 用户可以进行多次翻页,用offset表示用户已 ...
- 【精】LintCode领扣算法问题答案:1086. 重复字符串匹配
1086. 重复字符串匹配: 给定两个字符串A和B,找到A必须重复的最小次数,以使得B是它的子字符串. 如果没有这样的解决方案,返回-1. A和B的长度在1到10000之间. 样例 1 输入 : A ...
- 【精】LintCode领扣算法问题答案:316. 组合集
316. 组合集 描述 给一个数组,给出所有可能的排列组合出的数小于给定的数字 1 <= len(num) <= 10 0 <= num[i] <= 9 target < ...
- 【精】LintCode领扣算法问题答案:993. 数组划分 I
993. 数组划分 I: 给一个有 2n 个整数的数组,你的任务是把这些整数分成 n 组,如(a1, b1),(a2, b2),-,(an, bn).并且使得 i 从 1 到 n 的 min(ai, ...
- 【精】LintCode领扣算法问题答案:1371. 链表组件
1371. 链表组件 描述 给定一个链表(链表结点包含一个整型值)的头结点 head. 同时给定列表 G,该列表是上述链表中整型值的一个子集. 返回列表 G 中组件的个数,这里对组件的定义为:链表中一 ...
- 【精】LintCode领扣算法问题答案:3. 统计数字
3. 统计数字 计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值. 样例 1: 输入:k = 1, n = 1 输出:1 解释:在 [0, 1] 中,我们发现 1 出现了 1 ...
- 【精】LintCode领扣算法问题答案:626. 矩形重叠
626. 矩形重叠 给定两个矩形,判断这两个矩形是否有重叠. l1代表第一个矩形的左上角 r1代表第一个矩形的右下角 l2代表第二个矩形的左上角 r2代表第二个矩形的右下角 保证:l1 != r1 并 ...
最新文章
- 人工智能芯片支持超低功耗器件的推理
- 大数据算法系列——布隆过滤器
- Linux下如何生成core dump 文件(解决segment fault段错误的问题)
- 你会因为什么原因而离职
- 2021云上架构与运维峰会12月10日线上开启,五大精彩看点不容错过
- OSS.Social微信项目标准库介绍
- 转:Kafka事务使用和编程示例/实例
- java 中的堆和栈
- ajax 同步怎么回调,Ajax jquery同步回调成功
- java pdf增删改查_如何利用Java代码操作索引库?
- 看看ConcurrentLinkedQueue源码 in Java 9
- 【手写数字识别】基于matlab GUI BP神经网络手写数字识别(手写+带面板)【含Matlab源码 1196期】
- 如何关闭mac的SIP
- 计算机一级安装包怎么升级,详细教您win7如何升级为sp1
- 区块链入门系列之P2P
- 金融分析与风险管理——期权BSM模型
- 在html中书名号怎么写,html范本
- CAD中样条曲线Spline怎样才能分解成多段弧arc?
- 揭秘中国商品期货市场的9大重要因子
- 把Excel批注的“红三角”放在单元格左上角_44个Excel使用技巧:怪不得同事表格类工作那么快完成,学以致用...
热门文章
- 学习记录 Halcon 图片拼接
- 5. 位操作指令 AND,ORR, TST,BIC
- 内网禁用u盘 远程协助_如何在Windows 10中禁用远程协助
- 查询2021高考成绩位次,2021年江苏高考位次表及高考个人成绩排名查询
- 我喜欢的刀刀语录(一)
- <爬虫> 豆瓣电影排行榜(含代码)
- 裤子尺码对照表eur40_裤子的欧码32 34 36 38 40代表什么意思
- 密探查询系统服务器码,车辆国几排放查询
- 进制转换(简单的能看懂就够了)
- python怎么检查页面边距_Matplotlib页边距