A.每日一题——2141.同时运行N台电脑的最长时间

题目链接:2141. 同时运行 N 台电脑的最长时间(困难)

算法原理:

👉对应力扣题解

解法一 :二分查找

击败85.17%

时间复杂度O (m log S),其中 m 为电池数组 batteries 的长度,S 为所有电池的总电量

当运行时间最长为x分钟:

电量≥x的电池:x分钟内最多输出x(哪怕容量大,时间限制了它的总输出,且同一时刻只给一台供电)​

电量<x的电池:x分钟内最多输出自身电量(电量用完就无法再供电,所以不会同时给两台电脑用)

因此,每个电池的使用时间最多为min(batteriesi,x),累加所有电池的使用时间,记作sum,要让n台电脑同时运行x分钟,必须满足n*x<=sum

算法步骤:

1️⃣先算出总电量total,用l作为最终结果 ,r为最右边界(一定不能达到),则l+1也不可达到,当l+1==r时就是终止查找的时候

2️⃣计算每块电池在x分钟内能提供的最多电量总和

3️⃣如果满足n*x<=sum,说明可以尝试更长时间,l右移

4️⃣如果满足n*x>sum,说明不可行,要尝试更短时间,r左移

思考:为什么n*x<=sum能够保证不会出现一个电池同时给两台电脑充电(就是切换电池时一定要保证另一个电池空闲呢)的情况呢?

我们的目标是"n台电脑同时运行x小时",而式子保证了总供电量够(sum≥n*x),同时大容量电池的"空闲时间"提供了切换的物理空间------因为这些空闲时段可以用来给其他电脑补位,且不违反"同一时刻只给一台供电"的约束

解法二:排序 +贪心

击败28.72%

时间复杂度O(Nlogn)

受到解法一的启发,可以得到如下贪心策略:

先排序,从电量大的开始找,

如果当前电池电量 >x,就将其供给一台电脑,问题缩减为n-1台电脑的子问题

如果当前电池电量<=x,则其余电池电量均不超过x,此时n*x<=sum

根据解法一的结论,这些电池可以给n台电脑供电x分钟,此时说明剩下的电脑能够合理分配好,就可以返回 x作为答案了

JAVA代码:

java 复制代码
class Solution {
    public long maxRunTime(int n, int[] batteries) {
        long total=0;
        //计算所有电池的总电量
        for(int b:batteries) total+=b;
        //二分查找
        long l=0;//左端点:0小时一定能满足(无需运行)
        //右端点:总电量/n+1,这个时间一定无法满足
        //原因:n*(total/n+1)>tatal,总电量不够n台电脑运行那么久
        long r=total/n+1;
        //二分查找最长能运行的时间
        //开区间的终止条件:l+1==r,此时l就是最大 可运行时间
        while(l+1<r){
            //取中间值,用l+(r-l)/2避免溢出
            long x=l+(r-l)/2;
            //计算所有电池运行x小时能提供的有效总电量
            long sum=0;
            //每块电池最多贡献x小时的电量,超出x的部分用不上
            for(int b:batteries) sum+=Math.min(x,b);
            //判断x小时是否可行
            //可行,尝试更长时间
            if(n*x<=sum) l=x;
            //不可行,尝试更短时间
            else r=x;
        }
        return l;
    }
}
java 复制代码
class Solution {
    public long maxRunTime(int n, int[] batteries) {
        long total=0;
        Arrays.sort(batteries);
        for(int b:batteries) total+=b;
        for(int i=batteries.length-1;;i--){
            if(batteries[i]<=total/n) return total/n;
            total-=batteries[i];
            n--;
        }
    }
}
相关推荐
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
像我这样帅的人丶你还1 天前
Java 后端详解(四):分页与搜索
java·javascript·后端
她的男孩1 天前
数据权限为什么不能只靠注解?Forge 的 Mapper 层 SQL 改写源码拆解
java·后端·架构
tntxia1 天前
Mybatis的日志输入
java
亦暖筑序1 天前
Java 8老系统Browser Agent实战:三层拦截把AI操作后台变成可审计流程
java·后端·设计模式
用户298698530141 天前
Java 实现 Word 文档加密与权限解除
java·后端
Yeats_Liao1 天前
14:Servlet中的页面跳转-Java Web
java·后端·架构
未秃头的程序猿1 天前
告别"if-else地狱"!Java 21模式匹配,代码优雅了10倍
java·后端·面试
鹤望兰6751 天前
字节跳动国际支付-后端开发-三面面经
java