思路:贪心。先加倍最后再下载的时间是最短的,下载的次数为1-n,找到需要加倍到的最小值,枚举1-n即可。
class Solution {
public:
int leastMinutes(int n) {
int ans = INT_MAX;
for (int i = 1; i <= n; ++i) {
int j = ceil((double)n / i);
ans = min(ans, i + (int)ceil(log2(j)));
}
return ans;
}
};
易错点:每次翻倍,达到m 的最少次数为:log2(m),向上取整,用对数
优化:一直下载的速度是线性增长 ,加倍的速度是指数增长。n=1的时候都是1次,n=2的时候都是2次,n=3的时候都是3次,4的时候一直下载是4次,先加倍到>=n的总次数是3次,之后加倍的速度要渐渐高于线性的速度越来越多,所以,先加倍到>=n,然后再下载是最优的。
class Solution {
public:
int leastMinutes(int n) {
return ceil(log2(n)) + 1; //一句代码解决
}
};