华为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天完成所有工作

用例

题目解析

  1. 首先将输入的需求工作量转换为一个列表,例如输入为"6 2 7 7 9 3 2 1 3 11 4",则需求工作量列表为[6, 2, 7, 7, 9, 3, 2, 1, 3, 11, 4]。
  2. 对需求工作量列表进行排序,从小到大排列,以便后续分配给员工。
  3. 初始化一个变量max_days,用于记录完成所有工作所需的最短天数。
  4. 遍历需求工作量列表,对于每个需求工作量Xm,将其分配给当前最空闲的员工(即工作时间最短的员工),并更新该员工的工作时间。
  5. 在每次分配完一个需求后,检查是否已经分配完所有需求,如果是,则更新max_days为当前最大员工工作时间;否则,继续分配下一个需求。
  6. 最后输出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卷题目一样。多种语言解法,欢迎提供更好的解法。

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务