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

K0027. 魔法卷轴封印系统

中等通过率 71% · 提交 84 · 通过 60
模拟队列滑动窗口

在小慕的魔法工作室,他需要管理大量蕴含魔法能量的封印卷轴。这些卷轴必须按照严格的规则存放进中,否则能量会失控,造成混乱。 为此,小慕设计了一套,用来高效管理这些卷轴。系统按照以下规则运行: 1. 初始化封印系统:设置封印规则,包括 `timeWindow`、最大封印卷轴数 `maxFiles`、封印卷轴的魔法总量上限 `fileSize`。 2. 创建:每个卷轴按照时间顺序生成(严格递增),并带有唯一的编号 `fileId` 和魔法能量值 `fileSize`。 3. 执行封印:选择满足条件的卷轴,将其打包进魔法典籍中。 你的任务是实现这个魔法封印系统,使卷轴能够按照规则正确封印。

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

输入描述

第一行包含一个整数 `Q`,表示操作的总数。 接下来的 `Q` 行,每行描述一个操作,操作分为以下几种: 1. **初始化封印系统**: - 命令:`ZipSystem` - 参数: - `timeWindow`:时间窗口 `T`,表示卷轴的时间戳与队列中第一个卷轴的时间戳之差不能超过 `T`。 - `maxFiles`:最大封印卷轴数 `M`,表示每次封印操作最多可以封印 `M` 个卷轴。 - `maxSize`:魔法总量上限 `S`,表示每次封印操作的卷轴魔法能量值之和不能超过 `S`。 2. **插入卷轴**: - 命令:`insertFile` - 参数: - `timestamp`:卷轴的时间戳。 - `fileId`:卷轴的唯一编号。 - `fileSize`:卷轴的魔法能量值。 3. **执行封印**: - 命令:`zip` - 参数:无

输出描述

对于每个操作,输出相应的结果: 1. **初始化封印系统**: - 输出:`"null"`,表示初始化完成。 2. **插入卷轴**: - 输出:当前队列中的卷轴数量。 3. **执行封印**: - 输出:封印的卷轴编号列表,按升序排列,编号之间用空格分隔。如果没有满足条件的卷轴,输出空行。

示例

示例 1

输入

12
ZipSystem
10
3
15
insertFile
1
101
5
insertFile
2
102
4
insertFile
3
103
6
insertFile
5
104
3
insertFile
15
105
7
zip
insertFile
17
107
4
insertFile
20
94
3
zip
insertFile
20
85
1
zip

输出

null
1
2
3
4
5
101 102 103
3
4
104 105
3
85 94 107

说明:在这个示例中,魔法封印系统按照以下步骤运行: 1. **初始化封印系统**:设置时间窗口 `T=10`,最大封印卷轴数 `M=3`,魔法总量上限 `S=15`。系统初始化完成后输出 `"null"`。 2. **插入卷轴**: - 插入卷轴 `(1, 101, 5)`,队列中有 1 个卷轴,输出 `1`。 - 插入卷轴 `(2, 102, 4)`,队列中有 2 个卷轴,输出 `2`。 - 插入卷轴 `(3, 103, 6)`,队列中有 3 个卷轴,输出 `3`。 - 插入卷轴 `(5, 104, 3)`,队列中有 4 个卷轴,输出 `4`。 - 插入卷轴 `(15, 105, 7)`,队列中有 5 个卷轴,输出 `5`。 3. **第一次执行封印**: - 选择满足条件的卷轴 `101`、`102`、`103`,它们的魔法能量值之和为 `5 + 4 + 6 = 15`,未超过 `S=15`,且时间戳差不超过 `T=10`。 - 封印后输出 `101 102 103`,队列中剩余卷轴 `(5, 104, 3)` 和 `(15, 105, 7)`。 4. **继续插入卷轴**: - 插入卷轴 `(17, 107, 4)`,队列中有 3 个卷轴,输出 `3`。 - 插入卷轴 `(20, 94, 3)`,队列中有 4 个卷轴,输出 `4`。 5. **第二次执行封印**: - 选择满足条件的卷轴 `104` 和 `105`,它们的魔法能量值之和为 `3 + 7 = 10`,未超过 `S=15`,且时间戳差不超过 `T=10`。 - 封印后输出 `104 105`,队列中剩余卷轴 `(17, 107, 4)` 和 `(20, 94, 3)`。 6. **继续插入卷轴**: - 插入卷轴 `(20, 85, 1)`,队列中有 3 个卷轴,输出 `3`。 7. **第三次执行封印**: - 选择满足条件的卷轴 `85`、`94`、`107`,它们的魔法能量值之和为 `1 + 3 + 4 = 8`,未超过 `S=15`,且时间戳差不超过 `T=10`。 - 封印后输出 `85 94 107`,队列为空。

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

看不懂题目?点开图解
魔法封印系统流程初始化封印系统插入魔法卷轴执行封印设置T, M, S生成卷轴(时间,ID,能量)检查时间窗口与容量输出 "null"输出队列卷轴数量输出封印的卷轴ID列表完成操作,等待下一个命令
写完代码点「提交」,将对全部测试用例判题。

向老师提问

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