小慕正在开发一个资源调度系统,需要为不同类型的任务分配计算资源。任务类型编号为 `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