AtCoder 🌈 ABC457D Raise Minimum
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 ABC457D Raise Minimum
Problem Statement
題目簡述
給定一個長度為 的整數序列 與整數 。
可以進行 到 次操作,每次選擇一個滿足 的整數 ,並將 加上 。
求操作後序列中 的最大可能值。
Constraints
約束條件
- 所有輸入皆為整數
思路:二分答案
這題要最大化「所有元素中的最小值」。如果直接模擬每一次操作,會卡在操作次數可能很大;但我們其實不需要知道每一步怎麼做,只需要判斷某個候選最小值能不能被達成。
關鍵觀察
若某個目標值可以達成,那麼比它更小的目標值一定也可以達成;若某個目標值無法達成,那麼比它更大的目標值也一定無法達成。
這種「可行 / 不可行」具有單調性的答案空間,正適合用二分搜尋。
如何檢查一個目標值
假設現在想讓所有元素都至少變成某個目標值。對於已經不小於目標值的元素,不需要做任何事;對於還不夠大的元素,就必須補足差距。
第 個元素每操作一次可以增加 ,因此若它距離目標值還差 ,至少需要
次操作才能補到目標值以上。把所有不足元素需要的操作次數加總,如果總和不超過 ,代表這個目標值可行;反之不可行。
向上取整不要用浮點數
這裡的數值可能很大,用浮點數計算 ceil 可能產生精度問題。
整數形式可以寫成:
二分範圍
答案的下界可以從目前陣列的最小值開始,因為即使不做任何操作,最小值也至少是這個數。
答案的上界可以用「把所有操作都集中在某一個元素上」後,各元素各自能到達的最大值取最小:
真正的答案不可能超過這個值,因為任一元素最多也只能被操作 次。
複雜度分析
- 時間複雜度:,其中 是答案二分的值域大小。
- 空間複雜度:,除了輸入陣列外只使用常數額外空間。
Code
1 | def solve(): |
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus







