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

K0024. 幻影通讯

中等通过率 44% · 提交 175 · 通过 77
模拟贪心哈希表队列

在一个名为“幻影视界”的在线魔法影像项目中,小慕负责实现一套高可靠的服务调度系统。系统为不同类型的魔法影像分配专用,并支持用户按需申请和释放服务。每个用户在同一时段只能使用一个魔法影像服务,但可以多次申请。 请实现以下功能: 1. MagicService(int[] channels, int[] charge):初始化系统 - `channels[i]` 表示类型为 `i` 的魔法影像初始可用通道数量。 - `charge[i]` 表示类型为 `i` 的魔法影像的单位时间费用。 - 包括:普通魔法影像、高级魔法影像、超级魔法影像,分别用 `0`、`1`、`2` 表示,对应的魔法能量从低到高。 2. allocateChannel(int time, int userId, int videoType):在 `time` 时刻,用户 `userId` 申请使用 `videoType` 类型的魔法影像服务。计费依据本次申请的魔法影像类型,而非实际占用的通道类型。 - 如果当前 `videoType` 类型有可用通道,则占用一个通道,并返回 `true`。 - 否则,依次查找魔法能量更高的通道类型,如果有可用,则占用该类型的一个通道,并返回 `true`;如果仍无可用通道,则返回 `false`。 3. freeChannel(int time, int userId):在 `time` 时刻,用户 `userId` 申请停止正在使用的魔法影像服务: - 如果 `userId` 正在使用服务,则停止该服务并释放所占用的通道,并返回该次服务的费用(可能为 `0`);否则,返回 `-1`。 - 当有通道释放时,如果之前有其他用户因申请时通道不足而占用了更高魔法能量的通道,且其占用魔法能量高于释放通道的魔法能量、所申请魔法能量不高于释放通道的魔法能量,则选择一个用户进行,使用该释放通道。 - 优先选择占用魔法能量最高的用户;若仍有多个,则选择其中 `userId` 最小的。 - 注意:降级所释放的通道需要重复上述过程。 4. queryChannel(int userId):查询用户 `userId` 当前正在使用服务所占用通道的魔法影像类型;若用户不存在或已停服,则返回 `-1`。

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

输入描述

每行表示一个函数调用,初始化函数仅首行调用一次,累计函数调用不超过 `1000` 次。 - `1 <= channels[i] <= 1000`, `1 <= charge[i] <= 100`, `channels.length == charge.length == 3` - `1 <= time <= 1000`, `1 <= userId <= 1000` - 输入保证 `videoType` 的取值仅为 `0`、`1`、`2` 输入包含若干行,表示对魔法影像服务系统的操作。具体格式如下: 1. 第一行为一个整数 `Q`,表示总操作数。 2. 接下来的 `Q` 行,每行表示一个操作命令,命令后可能跟随参数: - **初始化命令**:`MagicService`,后跟两行输入: - 第一行:`channels`,表示每种魔法影像类型的初始可用通道个数,格式为 `[channels[0], channels[1], channels[2]]`。 - 第二行:`charge`,表示每种魔法影像类型的单位时间费用,格式为 `[charge[0], charge[1], charge[2]]`。 - **分配通道命令**:`allocateChannel`,后跟三行输入: - 第一行:`time`,表示操作时刻。 - 第二行:`userId`,表示用户 ID。 - 第三行:`videoType`,表示申请的魔法影像类型。 - **释放通道命令**:`freeChannel`,后跟两行输入: - 第一行:`time`,表示操作时刻。 - 第二行:`userId`,表示用户 ID。 - **查询通道命令**:`queryChannel`,后跟一行输入: - 第一行:`userId`,表示用户 ID。

输出描述

输出包含若干行,表示每个操作的返回值。具体格式如下: 1. **初始化命令**:输出 `null`。 2. **分配通道命令**: - 如果分配成功,输出 `True`。 - 如果分配失败,输出 `False`。 3. **释放通道命令**: - 如果释放成功,输出该次服务的费用。 - 如果用户未使用服务,输出 `-1`。 4. **查询通道命令**: - 如果用户正在使用服务,输出其占用通道的魔法影像类型。 - 如果用户不存在或已停服,输出 `-1`。

示例

示例 1

输入

6
MagicService
8 1 1
10 15 30
allocateChannel
3
107
1
allocateChannel
3
108
1
allocateChannel
5
110
1
queryChannel
108
freeChannel
13
108

输出

null
True
True
False
2
150

说明:- 初始化系统后,用户 `107` 和 `108` 成功申请高级魔法影像服务,用户 `110` 申请失败。 - 查询用户 `108` 正在使用超级魔法影像通道。 - 用户 `108` 停止服务后,返回费用 `150`。

示例 2

输入

11
MagicService
1 1 2
5 10 20
allocateChannel
1
100
0
allocateChannel
1
101
0
allocateChannel
2
102
0
allocateChannel
4
103
0
freeChannel
6
100
queryChannel
102
freeChannel
7
103
allocateChannel
7
104
1
freeChannel
8
102
queryChannel
104

输出

null
True
True
True
True
25
0
15
True
30
1

说明:- 初始化系统后,用户 `100`、`101`、`102`、`103` 分别申请普通魔法影像服务,但部分用户占用了更高魔法能量的通道。 - 用户 `100` 停止服务后,用户 `102` 被降级到普通魔法影像通道。 - 用户 `103` 停止服务后,用户 `101` 被降级到高级魔法影像通道,用户 `104` 成功申请高级魔法影像服务。 - 最终查询用户 `104` 正在使用高级魔法影像通道。

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

看不懂题目?点开图解
幻影通讯系统流程初始化channels, charge分配通道time, userId, videoType成功True无通道失败False释放通道time, userId降级处理选择用户费用数值查询通道userId返回类型0/1/2 或 -1
写完代码点「提交」,将对全部测试用例判题。

向老师提问

针对「幻影通讯」把疑问、代码和报错填清楚,老师收到后能更快、更准地回复你。