Python模拟餐厅顾客入座与离开:解决餐桌分配与等待超时问题
这个问题可以用模拟的方法来解决,需要跟踪餐桌的使用情况和顾客的等待队列。以下是Python实现方案: ```python import heapq def restaurant_simulation(M, D, customers): # 可用餐桌堆(存储释放时间) available_tables = list(range(1, M+1)) heapq.heapify(available_tables) # 正在使用的餐桌堆(存储(释放时间,桌号)) occupied_tables = [] # 等待队列(存储(到达时间+最大等待时间,到达时间,顾客编号)) waiting_queue = [] results = [] for idx, (arrival_time, max_wait) in enumerate(customers, 1): # 检查是否有餐桌释放 while occupied_tables and occupied_tables[0][0] <= arrival_time: release_time, table = heapq.heappop(occupied_tables) heapq.heappush(available_tables, table) # 处理等待队列中的顾客(按最早能等待到的时间) while waiting_queue and available_tables: max_wait_time, customer_arrival, customer_idx = heapq.heappop(waiting_queue) if customer_arrival + max_wait_time >= arrival_time: table = heapq.heappop(available_tables) release_time = arrival_time + D heapq.heappush(occupied_tables, (release_time, table)) results.append(f"顾客{customer_idx} 入座时间:{arrival_time} 离开时间:{release_time}") else: results.append(f"顾客{customer_idx} 未入座") # 处理当前顾客 if available_tables: table = heapq.heappop(available_tables) release_time = arrival_time + D heapq.heappush(occupied_tables, (release_time, table)) results.append(f"顾客{idx} 入座时间:{arrival_time} 离开时间:{release_time}") else: heapq.heappush(waiting_queue, (arrival_time + max_wait, arrival_time, idx)) # 处理剩余等待队列中的顾客 while waiting_queue: max_wait_time, customer_arrival, customer_idx = heapq.heappop(waiting_queue) results.append(f"顾客{customer_idx} 未入座") return results # 读取输入 M, D = map(int, input().split()) customers = [] while True: try: arrival, max_wait = map(int, input().split()) customers.append((arrival, max_wait)) except: break # 运行模拟并输出结果 results = restaurant_simulation(M, D, customers) for res in results: print(res) ``` 代码逻辑说明: 1. 使用两个堆来管理餐桌:`available_tables`存储可用餐桌编号,`occupied_tables`存储正在使用的餐桌及其释放时间 2. 使用一个堆`waiting_queue`来管理等待的顾客,按最早可能放弃等待的时间排序 3. 对每个到达的顾客,先检查是否有餐桌可以释放 4. 检查等待队列中是否有顾客可以被安排 5. 尝试安排当前顾客,如果不能安排则加入等待队列 6. 最后处理等待队列中剩余的顾客 三条额外需要注意的逻辑点: 1. 处理等待队列时要注意判断顾客是否已经超时(当前时间 > 到达时间+最大等待时间) 2. 餐桌释放时间是基于入座时间计算的,不是基于到达时间 3. 等待队列的处理必须在尝试安排当前顾客之前,以确保先到先服务的原则 ######[AI写代码神器 | 779点数解答 | 2025-03-28 15:50:35]
- 按键精灵实现:按F9启动,循环三次F2、X操作后再按F9的代码揭秘 (DeepSeek | 276点数解答 | 2025-02-23 00:05:43)288
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)414
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)487
- C3期末:精准求解 3 - 20 范围内数列第 k 项值及注意要点(字节豆包 | 242点数解答 | 2025-06-15 11:26:19)155
- C++求解:查找3 - 20项数列第k项值及注意要点(字节豆包 | 325点数解答 | 2025-06-15 11:27:11)174
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)439
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)434
- 银行服务同步:用信号量实现顾客与营业员的高效交互(阿里通义 | 539点数解答 | 2024-12-13 14:41:41)368
- 银行服务系统:用信号量实现顾客与营业员操作的互斥和同步(阿里通义 | 731点数解答 | 2024-12-13 14:42:20)214
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)440
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)546
- 解决Java调用Python接口时中文值乱码问题:设置字符编码为UTF-8(讯飞星火 | 264点数解答 | 2024-06-06 17:27:09)412