华为OD机试 - 高效的任务规划 - 逻辑分析(Java 2023 B卷 200分)

news/2024/7/20 19:34:00 标签: 华为od, java, 开发语言

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

你有 n 台机器,编号为 1~n,每台都需要完成一项工作,机器经过配置后都能完成独 立完成一项工作。

假设第 i 台机器你需要花 B 分钟进行设置,然后开始运行,J 分钟后完成任务。

现在,你需要选择布置工作的顺序,使得用最短的时间完成所有工作。

注意,不能同时对两台进行配置,但配置完成的机器们可以同时执行他们各自的工作。

二、输入描述

第一行输入代表总共有 M 组任务数据 (1<M<=10)。

每组数第一行为一个整数指定机器的数量 N (0<N<=1000)。

随后的 N 行每行两个整数,第一个表示 B (0<=B<=10000),第二个表示 J (0<=J<=10000)

每组数据连续输入,不会用空行分隔。各组任务单独计时。

三、输出描述

对于每组任务,输出最短完成时间,且每组的结果独占一行。

四、解题思路

题意要求:

不能同时对两台进行设置,并且 输出最短完成时间。

理解为:

  1. 执行时间越长的机器,越先设置,完成时间越短;
  2. 如果执行时间相等,设置时间越短,就会越先执行,完成时间越短;
  3. 当前机器的执行时间如果大于后面所有机器的设置时间,得到额外执行时间;
  4. 再对所有机器的额外执行时间进行比较,取最大值,再加上所有设置时间,即总运行时间;

五、Java算法源码

java">public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // m组任务
    int m = Integer.valueOf(sc.nextLine());
    StringJoiner stringJoiner = new StringJoiner("\n");
    for (int i = 0; i < m; i++) {
        // n台机器
        int n = Integer.valueOf(sc.nextLine());
        List<String> list = new ArrayList<>();
        for (int j = 0; j < n; j++) {
            list.add(sc.nextLine());
        }

        // 总设置时长
        int allSetTime = 0;

        /**
         * 不能同时对两台进行设置,并且 输出最短完成时间
         * 执行时间越长的机器,越先设置,完成时间越短
         * 如果执行时间相等,设置时间越短,就会越先执行,完成时间越短
         */
        List<String> sortList = list.stream().sorted(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                String[] arr1 = o1.split(" ");
                String[] arr2 = o2.split(" ");
                if (arr1[1].equals(arr2[1])) {
                    return arr1[0].compareTo(arr2[0]);
                } else {
                    return arr2[1].compareTo(arr1[1]);
                }
            }
        }).collect(Collectors.toList());
        System.out.println(list);
        System.out.println(sortList);

        /**
         * 当前机器的执行时间如果大于后面所有机器的设置时间,得到额外执行时间
         * 再对所有机器的额外执行时间进行比较,取最大值,再加上所有设置时间,即总运行时间
         *
         * [2 3, 4 3, 1 1]
         * [2 3, 4 3, 1 1]
         * 设置2,执行3  剩余执行3   设置4,执行3  剩余执行3     设置1,执行1   剩余最大执行2
         * 2                          +  4                       +1                +2   = 9
         */
        int[] runLeftTimeArr = new int[n];
        for (int j = 0; j < sortList.size(); j++) {
            String[] temp = sortList.get(j).split(" ");
            Integer currentSetTime = Integer.valueOf(temp[0]);
            // 当前机器的执行时间
            Integer currentRunTime = Integer.valueOf(temp[1]);
            // 总设置时长
            allSetTime += currentSetTime;

            for (int k = 0; k < j; k++) {
                if (runLeftTimeArr[k] > 0) {
                    runLeftTimeArr[k] -= currentSetTime;
                }
            }
            runLeftTimeArr[j] = currentRunTime;
        }

        int runLeftMax = 0;
        for (int j = 0; j < runLeftTimeArr.length; j++) {
            if (runLeftTimeArr[j] > runLeftMax) {
                runLeftMax = runLeftTimeArr[j];
            }
        }
        stringJoiner.add(allSetTime + runLeftMax+"");
    }
    System.out.println(stringJoiner);
}

六、效果展示

1、输入

1
3
1 1
4 3
2 3

2、输出

9

3、说明

  1. 先按执行时间降序排序,[4 3, 2 3, 1 1];
  2. 如果执行时间相同,再按设置时间升序排序,[2 3, 4 3, 1 1];
java">[2 3, 4 3, 1 1]
设置2,执行3  剩余执行3   设置4,执行3  剩余执行3     设置1,执行1   剩余最大执行2
2                          +  4                       +1                +2   = 9
  1. 机器1设置时间2,机器1剩余执行时间3;
  2. 机器2设置时间4,设置时机器1会执行完毕,机器2剩余执行时间3;
  3. 机器3设置时间1,机器2会执行1,机器2的剩余执行时间2,机器3的剩余执行时间1;
  4. 都设置完毕后,获取每一台机器的剩余执行时间,获取其最大值;
  5. 总设置时间 + 剩余最大执行时间 = 总的时间

在这里插入图片描述


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/5155109.html

相关文章

centos7配置网卡子接口

配置子接口 在 CentOS 7 中配置子接口可以用于实现虚拟化网络或者分割一个物理网络接口成多个逻辑接口&#xff0c;以实现不同的网络分割或 VLAN 支持。以下是在 CentOS 7 中配置子接口的一般步骤&#xff1a; 打开终端&#xff1a;首先&#xff0c;通过 SSH 或直接登录到 Cen…

VS编译器中创建新源文件,自动添加----#define _CRT_SECURE_NO_WARNINGS 1

每次创建新的源文件时都需要添加比较麻烦&#xff0c;我们让每次创建时自动添加&#xff0c;步骤如下&#xff1a; 1、右键编译器--->属性--->目标&#xff08;存放的是编译器的文件位置我们找到文件的位置&#xff09; 2、如下步骤找到“newc file.cpp”文件&#xff0…

map和set的例题

随机链表的复制 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 我们为什么要拷贝原链表的结点一个个链接到原链表结点的后面&#xff1f; 其实就建立了原链表结点与拷贝链表每个结点的一种映射关系, 方便我们设置拷贝结点的random域。 那我们现在C有了map: …

做一个交友app多少钱,交友app开发成本大揭秘

在如今社交化的时代&#xff0c;交友app正日益成为人们拓展社交圈、寻找真爱或结交新朋友的首选平台。随着用户需求的不断增长&#xff0c;许多有远见的创业者都渴望开发一款成功的交友app。不过&#xff0c;要想开发一款具备优质功能和用户体验的交友app&#xff0c;需要投入多…

同样是巡检,巡检系统在不同行业运用大不同

随着智能巡检系统使用的扩大&#xff0c;巡检管理系统越来越被人们认可使用与喜爱&#xff0c;尚未使用的也都在准备的路上了&#xff0c;然而如何选择还是有些模糊的。今天我们就一起看下智能巡检系统在不同行业是如何运用的。 写在前面知识普及&#xff0c;为了长远发展的需…

LeetCode算法题解(回溯)|39. 组合总和、40. 组合总和 II、131. 分割回文串

一、39. 组合总和 题目链接&#xff1a;39. 组合总和 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意…

【Python语言】集合的使用方法总结

目录 1、集合基本知识&#xff1a; 2、定义 2.1 定义集合变量 2.2 定义空集合 3、集合的常用操作 3.1 定义集合 3.2 添加新元素 3.3 移除元素 3.4 从集合中随机取出元素 3.5 清空集合 3.6 取两个集合的差集 3.7 消除两个集合的差集 3.8 两个集合合并 3.9 统计集合…

基于SpringAOP实现自定义接口权限控制

文章目录 一、接口鉴权方案分析1、接口鉴权方案2、角色分配权限树 二、编码实战1、定义权限树与常用方法2、自定义AOP注解3、AOP切面类&#xff08;也可以用拦截器实现&#xff09;4、测试一下 一、接口鉴权方案分析 1、接口鉴权方案 目前大部分接口鉴权方案&#xff0c;一般…