AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← 返回题库

K0013. 魔法装备管理系统

中等通过率 47% · 提交 149 · 通过 70
模拟哈希表排序

小慕正在开发一个资源调度系统,需要为不同类型的任务分配计算资源。任务类型编号为 `1`、`2` 和 `3`,对应的计算资源组编号也为 `1`、`2` 和 `3`。每个计算资源组包含若干计算节点,这些节点负责分配和管理任务的内存。 每个计算节点的编号从 `0` 开始,其内存容量为 `max_mem_size`。总共有 `proc_num` 个计算节点。 小慕需要实现一个管理系统,支持以下三种操作: 1. 创建任务 为一个任务分配内存并绑定到某个计算节点。优先选择最多的计算节点;如果空闲内存相同,选择编号较小的计算节点。 如果没有计算节点能满足所需的内存,返回 `-1`。 2. 删除任务 释放指定任务占用的内存,并从对应的计算节点解绑。如果该任务不存在,返回 `False`;否则返回 `True`。 3. 查询任务 返回某种类型的任务信息,按以下规则排序: - 按消耗的内存大小 `mem_size` 降序; - 若内存相同,按绑定的计算节点编号 `proc_id` 升序; - 若仍相同,按任务编号 `device_id` 升序。 输入保证 `device_id` 唯一,不会重复创建相同编号的任务。

提示:带虚线的词点一下有通俗解释。

输入描述

第一行包含一个整数 `Q`,表示总操作数。 接下来有 `Q` 行: - 如果操作是 **初始化系统**,输入格式为: ``` MagicDeviceMgtSystem proc_num max_mem_size ``` - 如果操作是 **创建魔法装备**,输入格式为: ``` create_device device_id device_type mem_size ``` - 如果操作是 **删除魔法装备**,输入格式为: ``` delete_device device_id ``` - 如果操作是 **查询魔法装备**,输入格式为: ``` query_device device_type ```

输出描述

对于每个操作,输出结果: - 如果是初始化操作,输出 `null`; - 如果是创建操作,输出绑定的守护进程编号;如果无法分配,输出 `-1`; - 如果是删除操作,输出 `True` 或 `False`; - 如果是查询操作,按格式输出查询到的装备信息,每行三个整数,分别表示 `device_id`、`mem_size` 和 `proc_id`。

示例

示例 1

输入

13
MagicDeviceMgtSystem
2
100
create_device
18
2
50
create_device
3
2
30
create_device
12
2
20
query_device
2
query_device
1
create_device
15
1
40
create_device
6
2
30
create_device
19
2
60
delete_device
18
create_device
26
2
70
query_device
1
query_device
2

输出

null
0
1
1
18 50 0
3 30 1
12 20 1
0
0
-1
True
0
15 40 0
26 70 0
6 30 0
3 30 1
12 20 1

说明:MagicDeviceMgtSystem(2, 100) create_device(18, 2, 50) create_device(3, 2, 30) create_device(12, 2, 20) query_device(2) query_device(1) create_device(15, 1, 40) create_device(6, 2, 30) create_device(19, 2, 60) delete_device(18) create_device(26, 2, 70) query_device(1) query_device(2)

时间限制 1000 ms · 内存限制 128 MB

看不懂题目?点开图解
魔法装备创建流程示例 守护进程 0 总内存: 100 已用: 50 空闲: 50 守护进程 1 总内存: 100 已用: 30 空闲: 70 新装备: 需要 40 内存 类型 1 空闲多? 空闲多? 选择守护进程 1(空闲更多)
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「魔法装备管理系统」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。