OD 算法题 B卷【模拟消息队列】
文章目录
- 模拟消息队列
模拟消息队列
- 模拟消息队列,有一个发布者、若干消费者,发布者在给定时刻向消息队列发布一条消息,这个消息会发送给订阅的消费者中优先级最高的一个;
- 若没有订阅的消费者,则该消息被丢弃;
- 发送消息与订阅同时发生时,优先处理订阅;
- 发送消息与取消订阅同时发生时,优先处理取消订阅操作;
输入描述:
第一行为2N个正整数,代表发布者发送的消息的时刻与内容;发送时刻不会重复,消息没有按照发送时刻排列;
第二行为2M个正整数,代表M个消费者订阅、取消订阅的时刻。消费者按照优先级升序排列;
N<=100, M<=10,每行的长度不超过1000字符;
输出描述:
输出为M行,依次为M个消费者收到的消息内容,消息内容按照收到的顺序排列,且空格分隔,若某个消费者未收到消息,则输出-1;
示例1
输入:
2 22 1 11 4 44 5 55 3 33
1 7 2 3
输出:
11 33 44 55
22
示例2
输入:
5 64 11 64 9 97
9 11 4 9
输出:
97
64
python实现:
- 以元组列表存储所有的消息,并按照发送时刻升序排列;
- 以列表存储消费者的订阅、取消订阅的时刻,越靠后的优先级越高;
- 以消费者索引为key,值为列表,用于存储每个消费者接收到的消息;
- 遍历每个消息元组,发送给优先级最高且满足要求的消费者;
# 消息发布
pub_msg_list = [int(i) for i in input().strip().split()]
msg_num = len(pub_msg_list) // 2
# 按照发送时刻升序排序
pair_msg_list = []
for i in range(msg_num):# 获取一个消息msg_time = pub_msg_list[2*i]msg_cnt = pub_msg_list[2*i+1]pair_msg_list.append((msg_time, msg_cnt))
# 升序排序
pair_msg_list.sort(key=lambda i:i[0])# 订阅者
suber_list = [int(i) for i in input().strip().split()]
suber_num = len(suber_list) // 2# 记录接收消息
receive_records = {}
for i in range(suber_num):receive_records[i] = []# 遍历每个消息,并与订阅时间点比较
for msg_time, msg_cnt in pair_msg_list:# 与订阅者比较for j in reversed(range(suber_num)):# 获取订阅时刻、取消订阅时刻sub_time, unsub_time = suber_list[2*j], suber_list[2*j+1]if msg_time >= sub_time and msg_time < unsub_time:receive_records[j].append(msg_cnt)break# 输出每个消费者接收到的消息
for i in range(suber_num):recv_msg = receive_records.get(i)if recv_msg:print(" ".join([str(j) for j in recv_msg]))else:print(-1)