华为OD机试 - 项目排期 - 贪心算法(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。

假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。

二、输入描述

第一行输入为M个需求的工作量,单位为天,用逗号隔开。 例如:X1 X2 X3 ... Xm 表示共有M个需求,每个需求的工作量分别为X1天,X2天...Xm天。其中0<M<30;0<Xm<200 第二行输入为项目组人员数量N 例如: 5 表示共有5名员工,其中0<N<10

三、输出描述

最快完成所有工作的天数 例如: 25 表示最短需要25天能完成所有工作。

四、解题思路

这个问题是典型的"负载均衡"问题,其中的目标是最小化完成所有任务的最大时间。在这个问题中,我们需要将M个任务(需求),每个有不同的工作量,分配给N个开发人员,使得所有工作被完成的总时间最小。

一个有效的方法是使用"最短处理时间优先"(SPT,Shortest Processing Time first)策略,结合"最长任务优先分配"(Largest Task First allocation)以及"贪心算法",使得总体完成时间最短。

具体步骤:

  1. 任务排序:首先按照工作量从大到小对需求进行排序。
  2. 初始化工作量数组:创建一个数组(或列表),用以记录每位开发人员当前的工作量。
  3. 贪心分配任务:依次将最大的任务分配给当前工作量最小的开发人员。

通过这种方式,我们尽可能保证每个人的负载都接近平均,但尽量让工作量较大的任务先分配,从而尽早开始执行耗时较长的任务。

五、Java算法源码

java 复制代码
public class OdTest01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取工作量和员工数
        String[] workloadStr = scanner.nextLine().split(" ");
        int[] workloads = Arrays.stream(workloadStr).mapToInt(Integer::parseInt).toArray();
        int numEmployees = Integer.parseInt(scanner.nextLine());

        // 计算最短完成时间
        int minDays = calculateMinimumDays(workloads, numEmployees);
        System.out.println(minDays);
    }

    private static int calculateMinimumDays(int[] workloads, int numEmployees) {
        // 将任务按照工作量从大到小排序
        Arrays.sort(workloads);
        // 初始化员工工作天数数组
        int[] employeeLoad = new int[numEmployees];

        // 从最大工作量任务开始分配
        for (int i = workloads.length - 1; i >= 0; i--) {
            int minLoadIndex = 0;
            // 找到当前工作量最小的员工
            for (int j = 1; j < numEmployees; j++) {
                if (employeeLoad[j] < employeeLoad[minLoadIndex]) {
                    minLoadIndex = j;
                }
            }
            // 分配任务给该员工
            employeeLoad[minLoadIndex] += workloads[i];
        }

        // 找出最大的工作量,即为完成所有任务的最少天数
        int maxDays = 0;
        for (int load : employeeLoad) {
            maxDays = Math.max(maxDays, load);
        }
        return maxDays;
    }
}

六、效果展示

1、输入

6 2 7 7 9 3 2 1 3 11 4

2

2、输出

28

3、说明

共有两位员工,其中一位分配需求6 2 7 7 3 2 1共需要28天完成,另一位分配需求9 3 11 4共需要27天完成,故完成所有工作至少需要28天。

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
云深麋鹿4 分钟前
数据链路层总结
java·网络
fire-flyer5 分钟前
响应式客户端 WebClient详解
java·spring·reactor
北执南念22 分钟前
基于 Spring 的策略模式框架,用于根据不同的类的标识获取对应的处理器实例
java·spring·策略模式
王道长服务器 | 亚马逊云26 分钟前
一个迁移案例:从传统 IDC 到 AWS 的真实对比
java·spring boot·git·云计算·github·dubbo·aws
华仔啊30 分钟前
为什么 keySet() 是 HashMap 遍历的雷区?90% 的人踩过
java·后端
9号达人43 分钟前
Java 13 新特性详解与实践
java·后端·面试
橙序员小站1 小时前
搞定系统设计题:如何设计一个支付系统?
java·后端·面试
嘟嘟可在哪里。1 小时前
IntelliJ IDEA git凭据帮助程序
java·git·intellij-idea
岁忧1 小时前
(LeetCode 每日一题) 3541. 找到频率最高的元音和辅音 (哈希表)
java·c++·算法·leetcode·go·散列表
_extraordinary_1 小时前
Java 多线程进阶(四)-- 锁策略,CAS,synchronized的原理,JUC当中常见的类
java·开发语言