华为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在线答疑。

相关推荐
哎呀呀嗯呀呀15 分钟前
class 031 位运算的骚操作
java·算法·位运算
2401_8581205318 分钟前
古典舞在线交流平台:SpringBoot设计与实现详解
java·spring boot·后端
大白飞飞25 分钟前
IDEA创建、导入、删除maven项目
java·maven·intellij-idea
赐你岁月如歌30 分钟前
如何使用ssm实现基于web的网站的设计与实现+vue
java·后端·ssm
2401_857297911 小时前
秋招内推2025-招联金融
java·前端·算法·金融·求职招聘
一 乐1 小时前
考研论坛平台|考研论坛小程序系统|基于java和微信小程序的考研论坛平台小程序设计与实现(源码+数据库+文档)
java·数据库·学习·考研·微信·小程序·源码
一 乐1 小时前
租拼车平台|小区租拼车管理|基于java的小区租拼车管理信息系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·微信·notepad++·拼车
xmh-sxh-13142 小时前
如何选择数据库架构
java
jxxchallenger2 小时前
踩坑spring cloud gateway /actuator/gateway/refresh不生效
java·数据库·gateway
远望樱花兔2 小时前
【d59】【Java】【力扣】146.LRU缓存
java·开发语言·算法