1701. 平均等待时间

目录

计算餐厅顾客的平均等待时间 — 单厨师订单处理模拟题解析

题目描述

解题分析

关键点:

如何模拟:

代码实现

复杂度分析

示例说明

总结


计算餐厅顾客的平均等待时间 — 单厨师订单处理模拟题解析

题目描述

有一家餐厅,只有一位厨师。餐厅中有一组顾客,customers,每个顾客由一个数组 [arrival_i, time_i] 表示:

  • arrival_i 是第 i 位顾客到达的时间(单位同一时间尺度)。
  • time_i 是厨师为这位顾客准备菜所需的时间。

规则:

  • 顾客到达时,会立即把订单交给厨师。
  • 厨师只能同时处理一个订单,且必须严格按照订单到达顺序逐一处理。
  • 当厨师空闲时,立刻开始处理下一个等待的订单。
  • 顾客会一直等待,直到厨师完成他们的订单。
  • 需要计算所有顾客的平均等待时间。等待时间定义为:

等待时间 = (厨师完成该顾客订单的时间) - (该顾客到达时间)

返回平均等待时间,允许与标准答案误差在 10^-5 以内。


解题分析

该问题本质是一个排队模拟(queue simulation)问题,核心在于跟踪厨师的工作时间线以及顾客订单的顺序处理。

关键点:

  1. 厨师只能同时处理一个订单,处理顺序严格按照顾客到达顺序。
  2. 厨师空闲时间要正确计算:如果当前厨师处理完前一个订单时,下一位顾客还未到达,厨师会空闲等待顾客到来。
  3. 等待时间计算:每位顾客的等待时间 = 订单完成时间 - 顾客到达时间。
  4. 需要求出所有顾客等待时间的平均值。

如何模拟:

  • 用一个变量 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

平均等待时间:\frac{2 + 6 + 7}{3} = \frac{15}{3} = 5.0


总结

本题通过模拟厨师的工作进度和顾客到达情况,合理计算等待时间,是典型的排队与调度模拟问题。实现简单且直观,重点是对时间变量的准确维护。

代码核心逻辑:

  • 判断厨师是否空闲,适时跳过时间。
  • 维护厨师完成当前顾客订单的时间点。
  • 计算并累积等待时间。

这种模拟思路在很多排队和调度问题中都很实用,也容易扩展至复杂场景。


如果你对代码实现或其他细节有疑问,欢迎随时交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值