↓快轉到主要內容
  1. LeetCode/

LeetCode 2141: Maximum Running Time of N Computers

·1 分鐘· ·
LeetCode Hard Greedy Binary-Search Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: hard 第一次嘗試:2026-07-28

  • 提交紀錄:Wrong Answer ×2 → Accepted

解題思路
#

電池可以隨時換,所以只要電量總和夠,時間可以平均分攤:理想上能跑 total // n 分鐘。

例外是特別大的電池:一顆電池同一時間只能放在一台電腦裡,所以它最多貢獻 T 分鐘給一台電腦。如果最大的電池比平均 total // n 還大,就讓它專門供一台電腦,多出來的電量浪費掉;把它和那台電腦一起拿掉,剩下的重新算平均。一直做到最大的電池不超過平均為止(Greedy 模板六)。

我的嘗試
#

  1. 第一版拿掉電池時沒有從總和扣掉。例如 n = 2、[7, 5]:答案是 5,這版拿掉 7 之後用 12 // 1 回傳 12。
  2. 第二版扣掉了,但條件是 avg <= batteries[-1],等於平均的電池也被拿掉。例如 n = 2、[4, 1, 4]:平均 9 // 2 = 4,拿掉一顆 4 之後剩 [1, 4] 給一台,平均變成 5,但被拿掉的那台只能跑 4 分鐘,答案是 4,這版回傳 5。
  3. 改成嚴格的 <,就 AC 了。

為什麼嚴格大於才安全:如果 b > total / n,拿掉後的平均 (total - b) / (n - 1) 一定小於 total / n,也就小於 b,被拿掉的那台跑得比剩下的久;等於平均時就不一定了。

正確解法
#

class Solution:
    def maxRunTime(self, n: int, batteries: List[int]) -> int:
        batteries.sort()
        total = sum(batteries)
        while batteries[-1] > total // n:
            total -= batteries.pop()
            n -= 1
        return total // n

n = 1 時平均就是總和,一定不小於最大的電池,迴圈不會把 n 減到 0。

也可以二分答案 T:檢查 sum(min(b, T)) >= n * T,每顆電池最多貢獻 T。

複雜度
#

時間 O(m log m),m 是電池數,空間 O(1)(不算排序)。

要特別避免的錯誤
#

  • 拿掉電池時,總和也要扣掉。
  • 等於平均的電池不要拿掉,條件要用嚴格大於。

面試口說整理
#

電池可以隨時換,所以理想上能跑總電量除以電腦數。但一顆電池同時只能給一台用,如果它比平均還大,就讓它專門供一台,把兩者一起拿掉重算平均,直到最大的電池不超過平均。要用嚴格大於,因為等於平均的電池拿掉後剩下的平均可能比它大。時間 O(m log m)。

相關文章

LeetCode 1793: Maximum Score of a Good Subarray
·1 分鐘
LeetCode Hard Two-Pointers Greedy Binary-Search Array Monotonic-Stack
LeetCode 1793 解題筆記:從 k 往兩邊擴張,每次往鄰居比較大的那一邊走,讓每個長度的最小值盡量大;到邊界時只能往另一邊
LeetCode 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 1402: Reducing Dishes
·1 分鐘
LeetCode Hard Dynamic-Programming Greedy Sorting Array
LeetCode 1402 解題筆記:排序後從滿意度大的開始選;每多選一道放在最前面,前面選的都往後一格,總和增加「目前選的滿意度總和」,總和是正的就繼續選
LeetCode 757: Set Intersection Size At Least Two
·1 分鐘
LeetCode Hard Greedy Sorting
LeetCode 757 解題筆記:按右端點排序(同右端點時左端點大的先),只記最右邊兩個點;沒蓋到就放右端兩點,只蓋到一個就補右端點
LeetCode 2968: Apply Operations to Maximize Frequency Score
·1 分鐘
LeetCode Hard Sliding-Window Sorting Prefix-Sum Binary-Search Array
LeetCode 2968 解題筆記:排序後,把一段全部變成同一個值,最省的目標是中位數;用前綴和 O(1) 算花費,花費隨視窗變大而變大,可以滑動
LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊