題目連結:
題目意譯:
現在有 n 個專案編號為 0 到 n - 1。你被給定一個整數陣列 milestone 其中 milestones[i] 代表著第 i 個專案的里程碑之數量。
你可以投入於專案去工作基於以下兩個規則:
每一週,你會完成正好一個專案中的一個里程碑。而你每週都必須工作。
你不能在連續兩週投入於同一專案的兩個里程碑上。
一旦所有專案的所有里程碑的完成後,或是你能選擇投入的里程碑將必會違反上述規則之時,你將會停止工作。注意,由於上列限制你可能會無法完成每個專案的里程碑。
回傳在不違反上述規則的情況下,你能投入於專案中的最大週數為何?
限制:
n == milestones.length
1 ≦ n ≦ 10 ^ 5
1 ≦ milestones[i] ≦ 10 ^ 9
範例測資:
範例 1:
輸入: milestones = [1,2,3]
輸出: 6
解釋: 一個可能的情景為:
- 在第 1 週時,你將投入於專案 0 的其中一個里程碑。
- 在第 2 週時,你將投入於專案 2 的其中一個里程碑。
- 在第 3 週時,你將投入於專案 1 的其中一個里程碑。
- 在第 4 週時,你將投入於專案 2 的其中一個里程碑。
- 在第 5 週時,你將投入於專案 1 的其中一個里程碑。
- 在第 6 週時,你將投入於專案 2 的其中一個里程碑。
週數總數為 6。
範例 2:
輸入: milestones = [5,2,1]
輸出: 7
解釋: 一個可能的情景為:
- 在第 1 週時,你將投入於專案 0 的其中一個里程碑。
- 在第 2 週時,你將投入於專案 1 的其中一個里程碑。
- 在第 3 週時,你將投入於專案 0 的其中一個里程碑。
- 在第 4 週時,你將投入於專案 1 的其中一個里程碑。
- 在第 5 週時,你將投入於專案 0 的其中一個里程碑。
- 在第 6 週時,你將投入於專案 2 的其中一個里程碑。
- 在第 7 週時,你將投入於專案 0 的其中一個里程碑。
週數總數為 7。
注意,你無法在第 8 週時投入於專案 0 的最後一個里程碑,因為會違反規則。
因此專案 0 將有一個里程碑無法完成。
解題思維:
假設所有專案中最大里程碑總數之值為 M,並假設其他專案的里程碑總數之總和為 T(注意,T 不包含 M)。
可以看到,我們可以交錯投入於 M 那個專案中(假設該專案為 P)或是其他專案(統稱為 P'),這樣的策略不會違反規則而且還會是最佳的。因此總週數會受限於 M 與 T 之間的關係。
因此當我們採?。?/div>
P → P' → P → P' → P……
也就是從專案 P 開始著手的交錯策略,此時如果 M 超級無敵大,則專案 P 只會被輪到 T + 1 次。此時專案 P 的里程碑不會被全數完成,而總週數為 2T + 1;反之,如果 T + 1 ≧ M,代表我們可以藉由專案 P 來把所有里程碑順利輪流做完,因此總週數為 T + M。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。