1. 程式人生 > 其它 >刷題-力扣-LCS 01. 下載外掛

刷題-力扣-LCS 01. 下載外掛

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

題目分析

  1. 根據題目描述,計算下載完成n個外掛需要最少的時間
  2. 優先考慮加速問題,直到1分鐘可以下載完成n個外掛
  3. 假設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];
    }
};