小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:
- 使用当前带宽下载插件
- 将带宽加倍(下载插件数量随之加倍)
请返回小扣完成下载 n 个插件最少需要多少分钟。
注意:实际的下载的插件数量可以超过 n 个
class Solution {
public:
//关于dp[(i+1)/2]+1?
// 这里不要考虑速度去理解!!
// 假设dp[5] = 4,也就是表示在这时的速度是能够在4min处理5个的,那如果我不加速,
// 其实就是8分钟处理10个,但是,我们知道插件加速就是速度*2,即速度加倍,
// 现在我想带宽加倍,让速度加倍使得能够4min处理10个,如此就是dp[(i+1)/2],
// 加速还花了1min,所以加上1
// 所以 dp[(i+1)/2]+1 表示我要用同样的时间做两倍的事情,但前提需要1min来加速
int leastMinutes(int n) {
vector<int> time(n+1);
time[0] = n;
if(n==1) return 1;
if(n>1){
for(int i = 1;i<=n;i++){
time[i] = min(time[i-1]+1,time[(i+1)/2]+1);
}
}
return time[n];
}
};