【华为OD机考真题】- 最大化控制资源成本(B卷-100分)(Java)

本文收录于「2025华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅题库正在疯狂收录中,up!up!up!!
提醒:拒绝一切代考/替考,违法必究!本人所写题库均搜集于互联网。
  
订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

1. 题目描述

具体题目描述如下:

公司创新实验室正在研究如何最小化资源成本,最大化盗源利用率,请你设计算法帮他们解决一个任务温部问题:有taskNum顶任务,每个任务有开始时间(startTime),结束时间(endTime),并行度(paralelism)三个属性,并行度是指这个任务运行时将会占用的服务器数量,一个服务器在每个时刻可以被任意任务使用但最多被一个任务占用,任务运行完成立即释放(结束时刻不占用)。任务混部问题是指给定一批任务,让这批任务由同一批服务器承载运行,请你计算完成这批任务混部最少需要多少服务器从而最大最大化控制资源成本

本文目录:

    • 1. 题目描述
    • 2. 输入描述
    • ️3. 输出描述
    • 4. 示例演示
      • ✨4.1 示例1
      • ✨4.2 示例2
      • ✨4.3 示例3
    • 5. 解题分析
      • 5.1 问题理解
      • 5.2 解题思路
      • 5.3 问题考点
      • 5.4 解题步骤
    • 6. 解题Coding
      • ✅6.1 代码实现
      • ⏱6.2 时间&空间复杂度
      • ⛓‍6.3 代码解析
      • 6.4 小结
    • 7. 测试用例
      • 7.1 测试用例1
        • ️7.1.1 输入
        • ️7.1.2 输出
        • ️7.1.3 实际运行结果展示
      • 7.2 测试用例2
        • ️7.2.1 输入
        • ️7.2.2 输出
        • ️7.2.3 实际运行结果展示
      • 7.3 测试用例3
        • ️7.3.1 输入
        • ️7.3.2 输出
        • ️7.3.3 实际运行结果展示
    • 8. 附录源码
    • 福利赠与你
      • 安利其他语言版本题解册
    • ‍Who am I?

温馨提醒: 大家在参加华为OD机试时,切记不要仅仅死记硬背题解代码。真正的通过率取决于你对代码的理解能力。建议你在理解基本原理和逻辑的基础上,模仿并自己编写代码,这样才能更有效地应对机试。

2. 输入描述

第一行输入为taskNum,表示有taskNum项任务
接下来taskNum行,每行三个整数,表示每个任务的开始时间
(startTime),结束时间(endTime),并行度(parallelism)

️3. 输出描述

一个整数,表示最少需要的服务器数量

4. 示例演示

✨4.1 示例1

输入:

3
2 3 1
6 9 2
0 5 1

输出:

2

示例说明:
一共有三个任务,第一个任务在时间区间【2,3】运行,占用1个服务器,
第二个任务在时间区间【6,9】运行,占用2个服务器,
第三个任务在时间区间【0,5】运行,占用1个服务器,需要最多服务器的时间。
区间为【2,3】和【6,9】,需要2个服务器。

✨4.2 示例2

输入:

2
3 9 2
4 7 3

输出:

5

示例说明:
一共两个任务,第一个任务在时间区间【3,9】运行,占用2个服务器,第二个任务在时间区间【4,7】运行,占用3个服务器,需要最多
服务器的时间区间为【4,7】,需要5个服务器。
备注:
1 <= taskNum <= 100000
0 <= startTime < endTime <= 50000
1 <= parallelism <= 100

✨4.3 示例3

输入:


输出:


示例说明:

5. 解题分析

5.1 问题理解

题目描述的是公司正在进行任务分配,每个任务都有一个时间段,以及并行执行度。我们需要计算最少需要多少个服务器才能同时执行所有任务,并且计算过程中,任务的执行时间不能重叠。如果多个任务的时间段存在重叠,那么就需要更多的服务器来处理它们。

5.2 解题思路

  1. 任务排序:首先我们要按照每个任务的开始时间进行排序,确保我们可以按顺序处理每个任务。
  2. 优先队列(最小堆):我们使用一个优先队列来模拟正在使用的服务器。每次新的任务开始时,我们检查当前队列中最早完成的任务是否已经完成,如果完成了,那么这个任务就可以共享服务器;如果没有完成,则需要一个新的服务器。
  3. 维护最大并发数:在每一步,我们都更新当前并发运行的任务数量(即正在使用的服务器数),并不断更新最大服务器数。

5.3 问题考点

  • 排序:按照任务的开始时间进行排序。
  • 优先队列(最小堆):用于存储当前正在执行的任务,依据结束时间优先出队。
  • 贪心算法:通过动态更新最小服务器数来达到最终最小服务器数。

5.4 解题步骤

  1. 将所有任务的时间段按照任务的开始时间进行排序。
  2. 初始化一个优先队列,用来存储正在执行的任务的结束时间和并行度。
  3. 对于每一个任务,检查队列中是否有已完成的任务。如果有,则将其移除,表示共享一个服务器;如果没有,则分配新的服务器。
  4. 更新最大服务器数。

6. 解题Coding

  根据如上题解思路,进行代码实战,大家请看如下,建议不要死记硬背代码,要理解其题型及实现思路,别担心,代码我都会给出超详细注释,你一定能看明白的。

✅6.1 代码实现

package com.demo.java.OD601_650.OD614;

import java.util.Scanner;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号:猿圈奇妙屋
 * @des: 【最大化控制资源成本(B卷-100分)】问题
 * @url: https://blog.csdn.net/weixin_43970743/article/details/146606540
 */
public class OdMain {
    public static void main(String[] args) {
        // 输入处理
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(); // 任务数量
        int[][] ranges = new int[n][3]; // 用二维数组存储每个任务的时间段和并行度
        for (int i = 0; i < n; i++) {
            ranges[i][0] = in.nextInt(); // 任务开始时间
            ranges[i][1] = in.nextInt(); // 任务结束时间
            ranges[i][2] = in.nextInt(); // 任务的并行度
        }

        // 调用最少服务器计算方法并输出结果
        System.out.println(minMeetingRooms(ranges));
    }

    // 计算最少服务器数的函数
    public static int minMeetingRooms(int[][] ranges) {
        // 按照任务的开始时间进行排序
        Arrays.sort(ranges, (a, b) -> a[0] - b[0]);

        // 使用优先队列来存储当前正在执行的任务的结束时间和并行度
        PriorityQueue<Integer[]> pq = new PriorityQueue<>((a, b) -> a[0] - b[0]);

        int res = 0; // 记录最少需要的服务器数
        int temp_res = 0; // 临时记录当前并发使用的服务器数

        // 遍历所有任务
        for (int i = 0; i < ranges.length; i++) {
            // 检查并清除已完成的任务
            while (pq.size() > 0) {
                Integer[] top = pq.peek();
                // 如果队列中最早完成的任务结束时间小于当前任务的开始时间,说明可以复用这个服务器
                if (top[0] < ranges[i][0]) {
                    Integer[] poll = pq.poll(); // 移除已完成的任务
                    temp_res -= poll[1]; // 减去该任务的并行度
                } else {
                    break; // 如果没有任务结束,退出循环
                }
            }

            // 将当前任务加入队列
            pq.offer(new Integer[]{ranges[i][1], ranges[i][2]});
            temp_res += ranges[i][2]; // 增加当前任务的并行度

            // 更新最小服务器数
            if (temp_res > res) {
                res = temp_res;
            }
        }
        return res; // 返回最少需要的服务器数
    }
}

⏱6.2 时间&空间复杂度

  • 时间复杂度

    • 输入解析为 O(n),因为我们需要读取每个任务的开始时间、结束时间和并行度。
    • 排序任务数组的时间复杂度为 O(n log n)。
    • 遍历任务并操作优先队列的时间复杂度为 O(n log k),其中 k 是并行度,通常小于 n。
    • 总体时间复杂度为 O(n log n)。
  • 空间复杂度

    • 主要使用了一个优先队列来存储任务,空间复杂度为 O(n)。

⛓‍6.3 代码解析

  首先,我们将输入的任务按开始时间排序,这样可以确保我们按顺序处理每个任务。接着,我们使用一个最小堆(优先队列)来记录当前执行中的任务。堆中的元素是任务的结束时间和并行度。对于每个任务,我们检查堆中最早结束的任务是否已经完成,如果已完成,则可以重用服务器;如果未完成,则需要分配新的服务器。在处理过程中,我们实时更新当前的服务器需求数,并更新最小服务器数。

6.4 小结

  • 通过本题,我们加深了对排序和优先队列(最小堆)的理解,尤其是在任务调度问题中,如何有效地管理资源(如服务器)。
  • 该题目考察了我们如何通过贪心算法逐步更新最小服务器需求数,并通过堆优化了任务调度的效率。
  • 理解任务调度问题中的资源复用和服务器分配对解决实际问题非常重要。

7. 测试用例

7.1 测试用例1

️7.1.1 输入
3
2 3 1
6 9 2
0 5 1
️7.1.2 输出
2
️7.1.3 实际运行结果展示

根据本地代码进行方法测试,本地运行结果展示如下:

【华为OD机考真题】- 最大化控制资源成本(B卷-100分)(Java)_第1张图片

7.2 测试用例2

️7.2.1 输入
2
3 9 2
4 7 3
️7.2.2 输出
5
️7.2.3 实际运行结果展示

根据本地代码进行方法测试,本地运行结果展示如下:

【华为OD机考真题】- 最大化控制资源成本(B卷-100分)(Java)_第2张图片

7.3 测试用例3

️7.3.1 输入

️7.3.2 输出

️7.3.3 实际运行结果展示

根据本地代码进行方法测试,本地运行结果展示如下:

8. 附录源码

  针对如上分享OD机试真题之外,这里我还开源全部OD机试原真题源码,供同学们一对一学习!对照每题都有题目号及详细代码注释。Gitee,例如题序号为1,则题解代码对应文件夹OD1,题序号为5,则题解代码对应文件夹OD5,以此类推,目的就是为了方便大家学习,一举上岸!(这里的题序号指专栏导航贴中表格一列的序号)

福利赠与你

  如果你还想学习更多相关OD真题题解,都建议直接毫不犹豫地学习此专栏「2025华为OD机试真题(全栈版)」,快速掌握Java、Python、C++、JavaScript等多种热门语言详细解题,快速突破华为OD机试,实现高分目标。还将提供线上多端答疑交流,解决你的所有问题!

安利其他语言版本题解册

  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【Python实现】
  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【Java实现】
  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【C++实现】
  • 【华为OD机试】2025年真题汇总A+B+C+D+E卷【JavaScript实现】

注意: 上述任意专栏一次订阅,获永久免费阅读权限,后续更新都能学习。
提示: 拒绝一切形式的代考,替考行为,务必诚信考试!!!本人所写题库均搜集于互联网。

‍Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

你可能感兴趣的:(华为od,java,python,华为OD机考真题,华为OD,最大化控制资源成本)