#B0035. VIP超市
VIP超市
题目描述
超市只有一个收银台,顾客按到达时间排队结账。顾客分为两种类型:
N:普通顾客V:VIP 顾客
VIP 顾客享有优先结账权。收银台的结账规则如下:
- 顾客到达时,根据类型进入对应队列的队尾:
N→ 普通队列V→ VIP 队列
- 收银台每次准备服务下一位顾客时,按以下顺序选择:
- 若 VIP 队列非空,则服务 VIP 队首顾客;
- 否则,若普通队列非空,则服务普通队首顾客;
- 若两个队列均为空,则本次服务无人,记为
EMPTY。
- 每位顾客的结账时间固定为 1 分钟,服务一旦开始便不会中断。
时间推进规则(重要)
时间从 0 分钟开始,以分钟为单位离散变化。每个整分钟时刻,事件发生的顺序为:先处理该时刻的所有到达,再完成上一次服务并选择下一位顾客。
-
时刻 0
① 将所有到达时间为0的顾客,严格按输入顺序 加入对应队列。
② 收银台立即按照规则选择一位顾客开始 第 1 次服务(即第 1 分钟的服务)。若此时队列全空,则第 1 次服务为EMPTY。 -
时刻 t ≥ 1
① 先 将所有到达时间为t的顾客,按输入顺序加入对应队列。
② 收银台上一次服务(或空闲)刚好在时刻 t 完成,立即按照规则选择下一位顾客,开始 第 t+1 次服务。若此时队列全空,则本次服务为EMPTY(空闲状态也会占用 1 分钟)。
简单来说:每分钟都是“先到先得”,即同一时刻的到达顾客可以立即参与该时刻的服务选择。
空闲的收银台在下一分钟开始时仍会尝试选择顾客,若依然无人则继续空闲。
输入格式
第一行两个整数 n 和 m,分别表示到达事件总数和需要输出的服务次数(分钟数)。
接下来 n 行,每行描述一个到达事件,格式为:
t type name
t:到达时间,0 ≤ t ≤ 10^9type:顾客类型,一个字符,只可能为'N'或'V'name:顾客名字,由小写字母组成,长度不超过 10
约束
1 ≤ n ≤ 100000,1 ≤ m ≤ 100000。所有到达事件按 t 非递减给出。
输出格式
输出共 m 行,第 i 行输出第 i 次服务(即第 i 分钟)被服务的顾客名字。
若该次服务时两个队列均为空,则输出 EMPTY。
样例输入
6 8
0 N tom
0 V lily
1 N jack
2 V alice
2 N bob
5 V lucy
样例输出
lily
tom
alice
jack
bob
lucy
EMPTY
EMPTY
样例解释
| 时刻 | 到达事件(按顺序处理) | 服务选择(服务开始时刻) | 第几次服务 |
|---|---|---|---|
| 0 | tom(N), lily(V) | VIP队有lily → 服务lily | 第1次 (0→1) |
| 1 | jack(N) | 上次lily完成,VIP空,普通有tom → 服务tom | 第2次 (1→2) |
| 2 | alice(V), bob(N) | 上次tom完成,VIP有alice → 服务alice | 第3次 (2→3) |
| 3 | 无 | 上次alice完成,VIP空,普通有jack → 服务jack | 第4次 (3→4) |
| 4 | 上次jack完成,普通有bob → 服务bob | 第5次 (4→5) | |
| 5 | lucy(V) | 上次bob完成,VIP有lucy → 服务lucy | 第6次 (5→6) |
| 6 | 无 | 上次lucy完成,队列全空 → EMPTY | 第7次 (6→7) |
| 7 | 上次空闲,队列仍空 → EMPTY | 第8次 (7→8) |
最终输出前 8 次服务,即与样例输出一致。
相关
在下列比赛中: