当前位置: 首页 > news >正文

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)
http://www.xdnf.cn/news/749341.html

相关文章:

  • Linux环境搭建MCU开发环境
  • [001]从操作系统层面看锁的逻辑
  • 计算机组织原理第三章
  • LearnOpenGL-笔记-其十二
  • 《高等数学》(同济大学·第7版) 的 详细章节目录
  • 顺序查找与折半查找
  • [python]Prophet‘ object has no attribute ‘stan_backend‘解决方法
  • Lyra学习笔记 Experience流程梳理
  • 5月31日day41打卡
  • 【Unity笔记】Unity WASD+QE 控制角色移动与转向(含 Shift 加速)实现教程
  • Qt -使用OpenCV得到SDF
  • thinkpad T-440p 2025.05.31
  • YOLOv10速度提升与参数缩减解析2025.5.31
  • 华为OD机试_2025 B卷_静态扫描(Python,100分)(附详细解题思路)
  • SAR ADC 同步逻辑设计
  • 【CBAP50技术手册】#31 Observation(观察法):BA(业务分析师)的“现场侦探术”
  • Kerberos面试内容整理-Kerberos 与 LDAP/Active Directory 的集成
  • 关于TongWeb数据源兼容mysql驱动的注意事项
  • 基于晶体塑性有限元(CPFEM)的钛合金圆棒拉伸过程模拟
  • 元胞自动机(Cellular Automata, CA)
  • 题海拾贝:P8598 [蓝桥杯 2013 省 AB] 错误票据
  • SHELL命令资料
  • C++类设计新思路:借鉴Promise链式调用的封装模式
  • CodeTop100 Day18
  • 【Python进阶】元编程、并发
  • @PathVariable注解-补充
  • (附代码)自定义 LangChain 文档分割器,深入探索 LangChain 文档分割策略与应用
  • 硬件开发全解:从入门教程到实战案例与丰富项目资源
  • 深入理解设计模式之解释器模式
  • Vue-过滤器