华为OD机试真题 - 项目排期 (D卷,200分)
题目描述
项目组共有 N 个开发人员,项目经理接到了 M 个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。
假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。
目录
题目描述
输入描述
输出描述
用例
题目解析
Java算法源码
JS算法源码
Python算法源码
C算法源码
华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100分,第三道为中等或困难题,分值为200分。总分为400分,150分钟,机试是在牛客考试,练习的时候也可以在牛客网练习,提前熟悉操作
https://ac.nowcoder.com/acm/contest/5652/K
点击上方链接进入牛客练习界面,可以自定义题目,自定义输入、输出等等,华为OD真实机试环境,非其他第三方平台模拟。
输入描述
第一行输入为 M 个需求的工作量,单位为天,用逗号隔开。
例如:
X1 X2 X3 ... Xm
表示共有 M 个需求,每个需求的工作量分别为X1天,X2天,...,Xm天。其中:
- 0 < M < 30
- 0 < Xm < 200
第二行输入为项目组人员数量N
例如:
5
表示共有5名员工,其中 0 < N < 10
输出描述
最快完成所有工作的天数
例如:
25
表示最短需要25天完成所有工作
用例
题目解析
- 首先将输入的需求工作量转换为一个列表,例如输入为"6 2 7 7 9 3 2 1 3 11 4",则需求工作量列表为[6, 2, 7, 7, 9, 3, 2, 1, 3, 11, 4]。
- 对需求工作量列表进行排序,从小到大排列,以便后续分配给员工。
- 初始化一个变量max_days,用于记录完成所有工作所需的最短天数。
- 遍历需求工作量列表,对于每个需求工作量Xm,将其分配给当前最空闲的员工(即工作时间最短的员工),并更新该员工的工作时间。
- 在每次分配完一个需求后,检查是否已经分配完所有需求,如果是,则更新max_days为当前最大员工工作时间;否则,继续分配下一个需求。
- 最后输出max_days作为结果。
JS算法源码
const rl = require("readline").createInterface({ input: process.stdin }); const readline = async () => (await rl[Symbol.asyncIterator]().next()).value; (async function () { const balls = (await readline()).split(" ").map(Number); const n = parseInt(await readline()); console.log(getResult(balls, n)); })(); function getResult(balls, n) { balls.sort((a, b) => b - a); let min = balls[0]; let max = balls.reduce((a, b) => a + b); let ans = max; while (min <= max) { const mid = (min + max) >> 1; if (check(balls, 0, new Array(n).fill(0), mid)) { ans = mid; max = mid - 1; } else { min = mid + 1; } } return ans; } function check(balls, index, buckets, limit) { if (index === balls.length) return true; const selected = balls[index]; for (let i = 0; i < buckets.length; i++) { if (i > 0 && buckets[i] === buckets[i - 1]) continue; if (selected + buckets[i] <= limit) { buckets[i] += selected; if (check(balls, index + 1, buckets, limit)) return true; buckets[i] -= selected; } } return false; }
Java算法源码
import java.util.Arrays; import java.util.Scanner; public class Main { static Integer[] balls; static int n; public static void main(String[] args) { Scanner sc = new Scanner(System.in); balls = Arrays.stream(sc.nextLine().split(" ")).map(Integer::parseInt).t
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2024华为OD机试题库D卷 文章被收录于专栏
2024年5-11月份考的D卷,不用再看AB卷,CD卷题目一样。多种语言解法,欢迎提供更好的解法。