2023小米秋招真题-手机流畅运行的秘密

2023小米秋招真题-手机流畅运行的秘密

这是一道小米面试题,使用贪心的思想

8月份发布会一结束,米小兔就在公司领到了一台最新发布的XiaomiMX Fold3手机。这是一款小米舰折屏手机,并搭载了全新升级架构的MIU114系统。其先进的应用引擎不仅让系统更流畅,应用体验也大幅提升。在一个优化项中,为了尽可能提升用户白天使用手机的体验和续航,某些已经在系统中注册过的任务会被设置为空闲任务,仅在手机空闲时运行(比如数据备份或AI相册整理)。现在系统中注册了若干组空闲任务,每个任务有各自的耗电量以及允许任务运行的最低初始电量,我们需要计算手机能够串行完成全部任务的最低初始电量。
注意点1 :所有电量以mAh(至安时)计,XaomiMX Fold3的大电池容量是4800mAh

**注意点2:**本题目假设手机在运行空闲任务期间,不处于充电状态,也没有额外耗电行为

注意点3:智能应用引擎会以最合适的顺序执行运行任务

输入描述

个猫述了所有任务的长字符串。任务与任务必间用逗号隔开,每组任务由耗电量及最低初始电量组成,用冒号隔

开。

输出描述

一个数字,代表依次完成全部任务的最低初始电量,如果最低初始电量超过手机电池容量,则返回-1

复制代码
// 样例输入
1:10,2:12,3:10

// 13

分析

每个任务有允许任务运行的最低初始电量,按照第一眼的想法可能会按照任务的最低初始电量递减排序去贪心。但是这样是不对的,举个例子

有两个任务,任务 1 耗电量是 cost1,允许任务运行的最低电量是 least1。任务 2 的耗电量和最低电量是 cost2least2。当前电量为 currentBattery,假设 cost1>currentBattery-least2cost2<=currentBattery-least1这两个式子是可以同时存在的

假如任务 1 的最低电量 > 任务 2 的最低电量,按照我们刚才贪心方法,优先执行最低电量高的任务,也就是先执行任务 1,任务 1 执行完后剩余电量为 currentBattery-cost1,根据 cost1>currentBattery-least2 可知 currentBattery-cost1 < least2 因此不能执行任务 2

而假如这时我们先执行任务 2 呢(最低电量低的任务 ),执行任务 2 后剩余电量为 currentBattery-cost2,根据 cost2<=currentBattery-least1 可知 currentBattery-cost2 >= least1 这时是可以接着运行任务 1的

以上分析证明了按照任务最低初始电量递减排序去贪心是不对的

那么该如何贪心呢?同样有任务 1 和 任务 2

  • 先执行任务 1,再执行任务 2,如果两个任务都能执行即 currentBattery-cost1>least2,那么 currentBattery 必须满足 currentBattery > cost1+least2
  • 先执行任务 2,再执行任务 1,如果两个任务都能执行即 currentBattery-cost2>least1,那么 currentBattery 必须满足 currentBattery > cost2+least1

题目要求初始电量最小,因此,就得取 cost1+least2cost2 +least1 两者的较小值 ,两边同减去 least1 和 least2,左边变成 cost1-least1,右边变成 cost2-least2,因此,如果 cost1-least1 较小就先执行任务 1,否则先执行任务 2。按照 cost-least 升序排序去贪心即可

最终代码展示

java 复制代码
package Y20222;

import java.util.*;

// 1:10,2:12,3:10
// 1:10,2:12,10:3
// 3:1,3:1,3:1
public class A {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.next();
        String[] strings = str.split(",");

        int n = strings.length;

        int[][] arr = new int[n][2];

        for(int i = 0;i < n;i ++) {
            String[] strings1 = strings[i].split(":");
            arr[i][0] = Integer.valueOf(strings1[0]);
            arr[i][1] = Integer.valueOf(strings1[1]);
        }

        Arrays.sort(arr,(a,b)-> a[0]-a[1]-(b[0]-b[1]));

        int ans = 0;
        int preCost = 0;
        for(int i = 0;i < n;i ++) {
            ans = Math.max(ans, preCost+Math.max(arr[i][0],arr[i][1]));
            preCost += arr[i][0];
        }

        System.out.println(ans <= 4800?ans:-1);
        scan.close();
    }


}
相关推荐
㓗冽3 小时前
60题之内难题分析
开发语言·c++·算法
大江东去浪淘尽千古风流人物3 小时前
【VLN】VLN仿真与训练三要素 Dataset,Simulators,Benchmarks(2)
深度学习·算法·机器人·概率论·slam
不倒翁玩偶3 小时前
IDEA导入新的SpringBoot项目没有启动按钮
java·spring boot·intellij-idea
小小小米粒3 小时前
Maven Tools
java
铉铉这波能秀3 小时前
LeetCode Hot100数据结构背景知识之字典(Dictionary)Python2026新版
数据结构·python·算法·leetcode·字典·dictionary
蜡笔小马3 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
kali-Myon3 小时前
2025春秋杯网络安全联赛冬季赛-day1
java·sql·安全·web安全·ai·php·web
我是咸鱼不闲呀3 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
唐梓航-求职中3 小时前
编程-技术-算法-leetcode-288. 单词的唯一缩写
算法·leetcode·c#
仟濹3 小时前
【算法打卡day3 | 2026-02-08 周日 | 算法: BFS】3_卡码网99_计数孤岛_BFS | 4_卡码网100_最大岛屿的面积DFS
算法·深度优先·宽度优先