leetcode 2141. 同时运行 N 台电脑的最长时间

答题思路参照:

力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/maximum-running-time-of-n-computers/solution/er-fen-da-an-fang-an-shuo-ming-by-lucife-81yw/

力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/maximum-running-time-of-n-computers/solution/er-fen-da-an-de-checkhan-shu-de-si-kao-f-g8no/力扣icon-default.png?t=M85Bhttps://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!');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值