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


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

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

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

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

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

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

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

    // 样例输入
    1:10,2:12,3:10
    
    // 13
    
    • 1
    • 2
    • 3
    • 4

    分析

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

    有两个任务,任务 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 升序排序去贪心即可

    最终代码展示

    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();
        }
    
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    基于Mybatis-Plus实现Geometry字段在PostGis空间数据库中的使用
    【深度学习】UNIT-DDPM核心讲解
    手机定制开发_基于天玑900的5G安卓手机定制方案
    一、iMove源码解读:初识
    你的Jmeter是不是经常乱码?教你用四种方法解决它!
    嵌入式Linux应用开发-基础知识-第十六章GPIO和Pinctrl子系统的使用
    深度融入垂直行业是物联网未来发展必由之路
    CopyOnWrite 容器
    Img-Diff: 多模态大型语言模型的对比数据合成
    无法对wsl-docker-data本身的unbutu镜像扩容操作
  • 原文地址:https://blog.csdn.net/kybabcde/article/details/132703078