目录
计算餐厅顾客的平均等待时间 — 单厨师订单处理模拟题解析
题目描述
有一家餐厅,只有一位厨师。餐厅中有一组顾客,customers
,每个顾客由一个数组 [arrival_i, time_i]
表示:
arrival_i
是第 i 位顾客到达的时间(单位同一时间尺度)。time_i
是厨师为这位顾客准备菜所需的时间。
规则:
- 顾客到达时,会立即把订单交给厨师。
- 厨师只能同时处理一个订单,且必须严格按照订单到达顺序逐一处理。
- 当厨师空闲时,立刻开始处理下一个等待的订单。
- 顾客会一直等待,直到厨师完成他们的订单。
- 需要计算所有顾客的平均等待时间。等待时间定义为:
等待时间 = (厨师完成该顾客订单的时间) - (该顾客到达时间)
返回平均等待时间,允许与标准答案误差在 10^-5
以内。
解题分析
该问题本质是一个排队模拟(queue simulation)问题,核心在于跟踪厨师的工作时间线以及顾客订单的顺序处理。
关键点:
- 厨师只能同时处理一个订单,处理顺序严格按照顾客到达顺序。
- 厨师空闲时间要正确计算:如果当前厨师处理完前一个订单时,下一位顾客还未到达,厨师会空闲等待顾客到来。
- 等待时间计算:每位顾客的等待时间 = 订单完成时间 - 顾客到达时间。
- 需要求出所有顾客等待时间的平均值。
如何模拟:
- 用一个变量
currTime
表示厨师当前“时刻”。 - 遍历顾客列表,每个顾客有
arrival
(到达时间)和time
(烹饪时间)。 - 对每个顾客:
-
- 如果厨师当前时间
currTime
小于顾客到达时间arrival
,说明厨师空闲等待,则把currTime
跳到arrival
。 - 从
currTime
开始处理该顾客订单,currTime += time
。 - 计算该顾客的等待时间为
currTime - arrival
。
- 如果厨师当前时间
- 累积所有顾客等待时间,最后除以顾客总数即为平均等待时间。
代码实现
from typing import List
class Solution:
def averageWaitingTime(self, customers: List[List[int]]) -> float:
currTime = 0
totalWait = 0
for arrival, time in customers:
# 如果厨师空闲,跳转到顾客到达时间
if arrival > currTime:
currTime = arrival
# 厨师开始做当前顾客的菜
currTime += time
# 等待时间 = 完成时间 - 到达时间
totalWait += currTime - arrival
return totalWait / len(customers)
复杂度分析
- 时间复杂度:
O(n)
,只遍历一次顾客数组。 - 空间复杂度:
O(1)
,只使用了几个变量,没有额外空间开销。
示例说明
假设有如下顾客数据:
customers = [[1, 2], [2, 5], [4, 3]]
- 顾客1:到达时间1,做菜时间2
- 顾客2:到达时间2,做菜时间5
- 顾客3:到达时间4,做菜时间3
模拟过程:
- 初始
currTime = 0
,顾客1到达时间1,厨师空闲,跳到1。 - 顾客1做菜:
currTime = 1 + 2 = 3
,等待时间 =3 - 1 = 2
- 顾客2到达时间2,厨师当前时间3,厨师忙,继续做菜。
- 顾客2做菜:
currTime = 3 + 5 = 8
,等待时间 =8 - 2 = 6
- 顾客3到达时间4,厨师当前时间8,忙,继续做。
- 顾客3做菜:
currTime = 8 + 3 = 11
,等待时间 =11 - 4 = 7
平均等待时间:
总结
本题通过模拟厨师的工作进度和顾客到达情况,合理计算等待时间,是典型的排队与调度模拟问题。实现简单且直观,重点是对时间变量的准确维护。
代码核心逻辑:
- 判断厨师是否空闲,适时跳过时间。
- 维护厨师完成当前顾客订单的时间点。
- 计算并累积等待时间。
这种模拟思路在很多排队和调度问题中都很实用,也容易扩展至复杂场景。
如果你对代码实现或其他细节有疑问,欢迎随时交流!