題目連結:
題目意譯:
現在有一間餐廳,裡面只有一位廚師。你被給定一個陣列 customers,其中 customers[i] = [arrivali, timei]:
arrivali 為第 i 位顧客的抵達時間。這些抵達時間將會以非遞減之序排序。
timei 是為第 i 位顧客準備其料理訂單的所需時間。
當一位顧客抵達時,他將會給予廚師其訂單,而廚師將會在閒置時開始準備該顧客的料理。顧客將會一直等待直到訂單被完成為止。廚師一次只會為一位顧客準備其料理。廚師會依照顧客們給定的順序來準備他們的料理。
回傳所有顧客的平均等待時間。與實際答案誤差 10 ^ (-5) 以內的答案將會視為是正確的。
限制:
1 ≦ customers.length ≦ 10 ^ 5
1 ≦ arrivali, timei ≦ 10 ^ 4
arrivali ≦ arrivali+1
範例測資:
範例 1:
輸入: customers = [[1,2],[2,5],[4,3]]
輸出: 5.00000
解釋:
1) 第一位顧客於時間 1 時抵達,廚師在時間 1 時立刻開始準備其料理訂單,並在時間 3 時完成 所以第一位顧客的等待時間為 3 - 1 = 2。
2) 第二位顧客於時間 2 時抵達,廚師在時間 3 時開始準備其料理訂單,並在時間 8 時完成 所以第二位顧客的等待時間為 8 - 2 = 6。
3) 第三位顧客於時間 4 時抵達,廚師在時間 8 時開始準備其料理訂單,並在時間 11 時完成 所以第三位顧客的等待時間為 11 - 4 = 7。
所以平均等待時間 = (2 + 6 + 7) / 3 = 5。
範例 2:
輸入: customers = [[5,2],[5,4],[10,3],[20,1]]
輸出: 3.25000
解釋:
1) 第一位顧客於時間 5 時抵達,廚師在時間 5 時立刻開始準備其料理訂單,並在時間 7 時完成 所以第一位顧客的等待時間為 7 - 5 = 2。
2) 第二位顧客於時間 5 時抵達,廚師在時間 7 時開始準備其料理訂單,並在時間 11 時完成 所以第二位顧客的等待時間為 11 - 5 = 6。
3) 第三位顧客於時間 10 時抵達,廚師在時間 11 時開始準備其料理訂單,並在時間 14 時完成 所以第三位顧客的等待時間為 14 - 10 = 4。
4) 第四位顧客於時間 20 時抵達,廚師在時間 20 時立刻開始準備其料理訂單,並在時間 21 時完成 所以第四位顧客的等待時間為 21 - 20 = 1。
所以平均等待時間 = (2 + 6 + 4 + 1) / 4 = 3.25。
解題思維:
這題的簡化版。本題甚至不需要優先佇列(Priority Queue),因為廚師只有一位。
由於廚師一次只會準備一份訂單,因此我們可以單純地用一個變數 T 來代表「現在的時間點」。一開始 T 為 0。
對於第 i 位顧客 customers[i],會有兩種情況。一種是 T < arrivali,此時廚師將會等到 arrivali 為止,因此 T 將會直接變成 arrivali;反之另一種為 T ≧ arrivali,此時顧客已經到了,所以當前時間 T 不變。
而這兩種情況可以簡寫成為 T = max(T, arrivali)。
經過上面的判斷之後,現在保證了第 i 位顧客已經抵達。因此廚師可以開始準備。因此時間將會移動到 timei 單位後。故 T = T + timei。
而第 i 位顧客的等待時間即為 T - arrivali。
將所有顧客的等待時間加總除以顧客總數即可。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。