难难难
cpp
class Solution {
public:
long long maxRunTime(int n, vector<int>& batteries) {
// reduce累加函数,用于计算所有电池的总电量
// 总电量决定了 "同时运行 n 台电脑" 的理论上限(最多能运行 tot / n
// 分钟,因为 n 台电脑同时运行时,每分钟消耗 n 单位电量)。
long long tot = reduce(batteries.begin(), batteries.end(), 0LL);
// 二分查找的初始化
long long l = 0, r = tot / n + 1;
//l(左边界):最短可能时间(0 分钟)。
//r(右边界):最长可能时间(总电量除以n,加 1 是为了覆盖边界情况)。
while (l + 1 < r) {
long long x = l + (r - l) / 2; // 中间值(当前尝试的运行时间)
long long sum = 0;
for (long long b : batteries) {
sum += min(b,x); // 每个电池最多贡献x分钟(因为运行x分钟的话,电池用不完也只能贡献x)
}
// 判断:如果总贡献>=n*x(n台电脑运行x分钟需要的总电量),说明x可行
(n * x <= sum ? l : r) = x;
// 语法结构:(条件 ? 变量A : 变量B) = 值;
// 等价于:如果条件成立,就把「值」赋给变量A;否则,把「值」赋给变量 B
// x 可行就把左边界右移(尝试更长时间),x 不可行就把右边界左移(尝试更短时间)
}
//二分结束后,l 就是最大的可行时间(因为循环条件是l+1 < r,最终 l 会停在最大的可行值)
return l;
}
};