刷題-力扣-LCS 01. 下載外掛
阿新 • • 發佈:2021-09-17
LCS 01. 下載外掛
題目連結
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/Ju9Xwi
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題目描述
小扣打算給自己的 VS code 安裝使用外掛,初始狀態下頻寬每分鐘可以完成 1 個外掛的下載。假定每分鐘選擇以下兩種策略之一:
使用當前頻寬下載外掛
將頻寬加倍(下載外掛數量隨之加倍)
請返回小扣完成下載 n 個外掛最少需要多少分鐘。
注意:實際的下載的外掛數量可以超過 n 個
示例 1:
輸入:n = 2 輸出:2 解釋: 以下兩個方案,都能實現 2 分鐘內下載 2 個外掛 方案一:第一分鐘頻寬加倍,頻寬可每分鐘下載 2 個外掛;第二分鐘下載 2 個外掛 方案二:第一分鐘下載 1 個外掛,第二分鐘下載 1 個外掛
示例 2:
輸入:n = 4
輸出:3
解釋:
最少需要 3 分鐘可完成 4 個外掛的下載,以下是其中一種方案:
第一分鐘頻寬加倍,頻寬可每分鐘下載 2 個外掛;
第二分鐘下載 2 個外掛;
第三分鐘下載 2 個外掛。
提示:
- 1 <= n <= 10^5
題目分析
- 根據題目描述,計算下載完成n個外掛需要最少的時間
- 優先考慮加速問題,直到1分鐘可以下載完成n個外掛
- 假設dp[i]表示下載i個外掛需要的最少時間,則狀態轉移方程dp[i]=min(dp[i-1,dp[(i+1)/2])+1,邊界條件為dp[1]=1
程式碼
class Solution { public: int leastMinutes(int n) { vector<int> dp(n + 1, 1); for (int i = 2; i <= n; ++i) { dp[i] = min(dp[i - 1], dp[(i + 1) / 2]) + 1; } return dp[n]; } };