@laigary.com~/interview/coding/1011-capacity-to-shi….md$
$ cat ./coding/1011-capacity-to-ship-packages-within-d-days.md
[Coding]·2023-01-28·2 min read

1011. Capacity To Ship Packages Within D Days

1011. Capacity To Ship Packages Within D Days

題目weights 是包裹重量,必須依序寄送,要在 days 天內運完,求貨櫃的最小容量。

為什麼不是 DP:順序固定,切分點之間沒有可重用的子問題,寫不出轉移方程。

改用二分答案。搜尋空間 [max(weights), sum(weights)]

  • 下界 max(weights):容量比最重的包裹小 → 那個包裹永遠裝不進去。
  • 上界 sum(weights):一天全部運完,再大也沒意義。

check(cap):貪心,依序裝,裝不下就換新的一天。

def need_days(cap):
    days, cur = 1, 0
    for w in weights:
        if cur + w > cap:
            days += 1
            cur = 0
        cur += w
    return days

單調性:cap 越大 → 天數越少。

  • need_days(cap) > days → 太小 → left = cap + 1
  • 否則可行 → right = cap - 1(往更小試)

回傳 left = 第一個可行的容量。

class Solution:
    def shipWithinDays(self, weights: List[int], days: int) -> int:
        
        def need_days(cap):
            days, cur = 1, 0
            for w in weights:
                if cur + w > cap:
                    days += 1
                    cur = 0
                cur += w
            return days

        left = max(weights)
        right = sum(weights)

        while left <= right:
            mid = left + (right - left) // 2
            if need_days(mid) > days:
                left = mid + 1
            else:
                right = mid - 1
        
        return left