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

相关推荐
河阿里16 分钟前
Spring AOP:企业级实战教学
java·后端·spring
lagrahhn16 分钟前
IDEA一些提效的方法
java·ide·intellij-idea
yuanpan24 分钟前
Python Scrapy 入门教程:从零学会抓取和解析网页数据
java·python·scrapy
Bat U25 分钟前
JavaEE|多线程(五)
java·开发语言·jvm
疋瓞29 分钟前
pringBoot + 若依框架开发与部署流程
java
豆豆34 分钟前
高校网站用什么CMS?站群管理+国产化适配方案
java·大数据·cms·建站系统·信创国产化·高校网站·站群cms
captain37642 分钟前
JDBC(Java Data Base Connectivity)
java·开发语言
longxibo1 小时前
【flowable 7.2.0 二开之三:基于 Flowable 7.2 的审批流系统解压即用】
java·tensorflow·jar
拾-光1 小时前
LTX-Video 2.3 实战:用图片生成视频,消费级显卡也能跑的开源 I2V 模型(GPT Image 2)
java·人工智能·python·深度学习·算法·机器学习·音视频
普修罗双战士1 小时前
高效使用 Git:从入门到精通的实战指南
java·git