答题思路参照:
力扣https://leetcode.cn/problems/maximum-running-time-of-n-computers/solution/er-fen-da-an-de-checkhan-shu-de-si-kao-f-g8no/力扣
https://leetcode.cn/problems/maximum-running-time-of-n-computers/solution/liang-chong-jie-fa-er-fen-da-an-pai-xu-t-grd8/
<?php
class Solution {
/**
* @ref https://leetcode.cn/problems/maximum-running-time-of-n-computers/
* @video https://www.bilibili.com/video/BV1UB4y1S7dF?p=3&spm_id_from=pageDriver&vd_source=94ee508abed728d924a60794d1d2b547
* @param Integer $n
* @param Integer[] $batteries
* @return Integer
*/
function maxRunTime($n, $batteries) {
$size = count($batteries);
sort($batteries);
if($size < $n) return 0;
$sums = [$batteries[0]];
for($i = 1; $i < $size; $i++) {
$sums[$i] = $sums[$i - 1] + $batteries[$i];
}
$l = $m = 0;
$r = $sums[$size - 1] / $n;
while($l <= $r) {
$m = ($l + $r) >> 1;
if($this->ok($batteries, $sums, $m, $n)) {
$l = $m + 1;
} else {
$r = $m - 1;
}
}
// 忽略科学计数
return number_format(floor($r), 0, '', '');
}
/**
* @param []int $batteries 电池数组
* @param []int $sums 前缀和数组
* @param int $time 需要撑够的分钟数
* @param int $num 电脑数目
*/
function ok($batteries, $sums, $time, $num) {
$l = $m = 0;
$r = count($batteries) - 1;
$size = count($batteries);
$left = 0;
// 大于等于 $time的最左位置
// 大于$time的电池直接就可以满足
while($l <= $r) {
$m = floor(($l + $r) / 2);
if($batteries[$m] >= $time) {
$left = $m;
$r = $m - 1;
} else {
$l = $m + 1;
}
}
$restK = $left == 0 ? 0 : $left -1;
return $sums[$restK] + $time * ($size - $restK - 1) >= $time * $num;
}
}
$s = new Solution();
//echo number_format(1e14, 0, '', '');exit;
$ans = $s->maxRunTime(2, [3,3,3]);
var_dump($ans);
assert($ans == 4, '[3,3,3], n=2, result should be 4!');
$ans = $s->maxRunTime(3, [10,10,3,5]);
var_dump($ans);
assert($ans == 8, '[10,10,3,5], n=3, result should be 8!');