【华为OD机试】统一限载货物数最小值
统一限载货物数最小值
题目描述
火车站附近的货物中转站负责将到站货物运往仓库,小明在中转站负责调度2K辆中转车(K辆干货中转车,K辆湿货中转车)。
货物由不同供货商从各地发来,各地的货物是依次进站,然后小明按照卸货顺序依次装货到中转车上,一个供货商的货只能装到一辆车上,
不能拆装,但是一辆车可以装多家供货商的货;
中转车的限载货物量由小明统一制定,在完成货物中转的前提下,请问中转车的统一限载货物数最小值为多少。
输入描述
第一行length
表示供货商数量 1<= length <= 10^4
第二行goods
表示供货数数组 1 <= goods[i] <= 10^4
第三行types
表示对应货物类型,types[i]等于0
或者1
,0
代表干货,1
代表湿货
第四行k
表示单类中转车数量1 <= k <= goods.length
输出描述
一个整数,表示中转车统一限载货物数
补充说明
中转车最多跑一趟仓库
示例
示例1
输入
4
3 2 6 3
0 1 1 0
2
输出
6
说明
示例2
输入
4
3 2 6 8
0 1 1 1
1
输出
16
说明
解题思路
已知
- 干货、湿货分别用不同的车运输,两种类型车数量一致;
- 一个供货商的货只能装到一辆车上;
- 需要一次运输完成;
思路
求取单类货物最小限载数(平均值与最大货物数比较)及单类货物总值,每一次以中位数查找是否存在满足的情况,直到求取最终值。
代码示例
/*** 获取最小统一限载货物数* @param goods 供货数* @param types 货物类型,0-干货 1-湿货* @param k 单类中转车数量* @return 最小统一限载货物数*/
public int loadLimit(int[] goods, int[] types, int k) {LinkedList<Integer> dryList = new LinkedList<>();LinkedList<Integer> wetList = new LinkedList<>();// 干物最大值、湿物最大值、干物总值、湿物总值int dryMax = 0, wetMax = 0, drySum = 0, wetSum = 0;for (int i = 0, l = goods.length; i < l; i++) {if(types[i] == 0) {drySum += goods[i];dryMax = Math.max(dryMax, goods[i]);dryList.add(goods[i]);} else {wetSum += goods[i];wetMax = Math.max(wetMax, goods[i]);wetList.add(goods[i]);}}return Math.max(binarySearch(dryList, k, dryMax, drySum), binarySearch(wetList, k, wetMax, wetSum));
}/*** 二分查找最小限载* @param goods 单类货物集合* @param k 车辆数* @param weightMax 单类货物最大供货数* @param weightSum 单类货物供货数总和* @return 最小限载数*/
private int binarySearch(List<Integer> goods, int k, int weightMax, int weightSum) {int min = Math.max(weightMax, (weightSum + k - 1) / k);int max = weightSum;while(min < max) {int mid = (min + max) / 2;if(check(goods, new int[k], 0, mid)) {max = mid;} else {min = mid + 1;}}return min;
}/*** 校验指定限载下是否有解* @param goods 货物集合* @param arr 车载数组* @param index 当前处理货物下标* @param weight 限载数* @return*/
private boolean check(List<Integer> goods, int[] arr, int index, int weight) {// 货物遍历完成,直接返回if(index >= goods.size()) {return true;}for(int i = 0, l = arr.length; i < l; i++) {if(arr[i] + goods.get(index) <= weight) {arr[i] += goods.get(index);// 递归下一个货物if(check(goods, arr, index + 1, weight)) {return true;}// 不满足条件时将货物取出arr[i] -= goods.get(index);}}return false;
}
【华为OD机试】统一限载货物数最小值相关推荐
- 华为OD机试 - 统一限载货物数最小值(Java JS Python)
题目描述 火车站附近的货物中转站负责将到站货物运往仓库,小明在中转站负责调度2K辆中转车(K辆干货中转车,K辆湿货中转车). 货物由不同供货商从各地发来,各地的货物是依次进站,然后小明按照卸货顺序依次 ...
- 华为OD机试 - 不含101的数
题目描述 小明在学习二进制时,发现了一类不含 101的数,也就是: 将数字用二进制表示,不能出现 101 . 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个不含 101 的数? 输入描述 ...
- 华为OD机试真题 Python 实现【统一限载最小值】【2023 Q1 | 200分】
所有题目均有三种语言实现.C++ 实现目录.Python实现目录.Java实现目录 题目 题目描述 火车站附近的货物中转站负责将到站货物运往仓库,小明在中转站负责调度2K辆中转车( K 辆干货中转车 ...
- 2023华为OD机试备考攻略 以及题库目录分值说明 考点说明
刷题库,刷题库 刷题库.重要的事情说三遍!!!!!!!!!!!!!!!!!!!!!! 要刷有多种语言的实现的题库,一种语言看不懂可以换另一种语言,而且可以结合起来去重!!! 类似下面这种的题库: 华为 ...
- 华为OD机试(A、B卷)、机考,200分的题目整理如下,冲满分必备
文章目录 关于华为 od 题库的说明(2023-05-16 更新本文) 关于订阅华为 OD 机试题库的后续问题 华为 OD 机试 真题,新题库,50 道 200 分题 华为 od 岗的薪资待遇 华为 ...
- 华为od机试(适用B卷),独家整理 已参加机试人员的实战技巧
华为 OD 机试过程中,都会碰到哪些问题呢,橡皮擦今天为大家整理一下,希望对即将参加机试的[你]有所帮助. 这个是一系列关于华为 OD 的各种问题,你也可以在评论区提问 每篇博客精选 OD 参与者的 ...
- 华为OD机试2023年最新题库(JAVA、Python、C++)
我是一名软件开发培训机构老师,我的学生已经有上百人通过了华为OD机试,学生们每次考完试,会把题目拿出来一起交流分享. 2023年5月份题库已经更新为OD统一考试(B卷),题库由三部分组成: 1.202 ...
- 华为OD机试真题2023(JavaScript)
华为机试题库已由2022版换为2023版 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100分,第三道为中等或困难题,分值为200分.总分为400分,150分钟考试时间.之前通过为1 ...
- 2023 华为OD机试备考攻略 以及题库目录分值说明 考点说明 (A卷+ B卷)
文章目录 华为OD在线刷题OJ 华为题库 更新说明 支持的语言 题库目录 华为OD统一考试[A卷]题库-100分 华为OD统一考试[A卷]题库-200分 华为OD统一考试[B卷]题库-100分 华为O ...
最新文章
- mysql遇到your password does not satisfy the current policy requirements
- java在图片下方写文字_Java画图给图片底部添加文字标题
- 洛谷 P1414 又是毕业季II (多个数的最大公因数)
- mysql学习笔记01-创建数据库
- 前端解决跨域的九种方法
- 证监会将开启私募机构新三板做市试点
- CSS选择器优先级计算
- VB2010中的MediaPlayer控件在哪?
- ISO 27001信息安全管理体系认证
- Excel如何随机抽取姓名或其他数据
- SAP PI PO XSLT Mapping of Adapter-Specific Message Attributes
- ios vue 添加本地音乐_苹果手机vue怎么添加自己的音乐
- 计算机能力提升选网络研修,教师计算机能力提升个人研修计划
- 利用毒株的accession号,批量下载fasta格式的文件
- 2022-2027年中国自动体外除颤器行业发展监测及投资战略研究报告
- Qt中使用httpServer框架
- Java——使用多线程模拟真实高并发业务并保证安全性(一)
- macOS 切换python版本
- 统计每一个用户(手机号)所耗费的上行流量,下行流量,总流量
- 如何辨别优劣高防服务器?