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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、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算法源码

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];
[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在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117753.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

挑战100天 AI In LeetCode Day02(1)

挑战100天 AI In LeetCode Day02&#xff08;1&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-32.1 题目2.2 题解 三、面试经典 150 题-33.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&#xff0c;面向程序…

Linux中的高级IO

文章目录 1.IO1.1基本介绍1.2基础io的低效性1.3如何提高IO效率1.4五种IO模型1.5非阻塞模式的设置 2.IO多路转接之Select2.1函数的基本了解2.2fd_set理解2.3完整例子代码&#xff08;会在代码中进行讲解&#xff09;2.4优缺点 3.多路转接之poll3.1poll函数的介绍3.2poll服务器3.…

4.网络之TCP

TCP协议(传输层) 文章目录 TCP协议(传输层)1. TCP报文格式2. TCP相关机制2.1 确认应答机制2.2 超时重传机制2.3 连接管理机制&#xff08;重点&#xff09;2.3.1 三次握手2.3.2 四次挥手 2.4 滑动窗口机制2.5 流量控制机制2.6 拥塞控制机制2.7 延迟应答机制2.8 捎带应答机制 3.…

Linux工具git版本控制器介绍

git介绍 ​ git就是一个版本控制器&#xff0c;是由Linux之父写的开源软件&#xff0c;功能就是保存每个版本的内容。将被管理的内容&#xff08;文本&#xff09;&#xff0c;按照变化来进行管理的软件&#xff0c;你需要哪一个变化的版本都可以找到。 git是一个软件&#x…

ATE新能源汽车充电桩自动负载测试系统

随着新能源汽车的普及&#xff0c;充电桩的需求也在不断增加&#xff0c;为了确保充电桩的性能和安全性&#xff0c;对其进行负载测试是非常重要的。ATE新能源汽车充电桩自动负载测试系统是一种专门用于检测充电桩性能的设备&#xff0c;它可以模拟各种实际使用场景&#xff0c…

打造高效运营底座,极智嘉一体化软件系统彰显科技威能

在仓储成本和物流需求日益增加的今天&#xff0c;创新且高效的物流机器人解决方案能够显著提升物流运营效率&#xff0c;降低物流成本&#xff0c;实现智能化、精益化、一体化的物流管理。全球仓储机器人引领者极智嘉(Geek)以「一套系统&#xff0c;天生全能」为准则&#xff0…

数据集:机器人理解世界的关键

原创 | 文 BFT机器人 传统的机器人和工业自动化解决方案已经颇有成效。在工厂中入驻自动化机器人可以快速地帮助工人们完成长时间重复劳动的任务。随着用工成本上涨、技能人才短缺、工作环境恶劣等问题的凸显&#xff0c;社会更迫切地需要采用自动化设备代替人工来完成该类操作…

又要报销了,还在手动下载整理发票吗?

大多数公司都是每个月定期提交报销&#xff0c;一般报销用的发票都是电子发票发到邮箱&#xff0c;每次要报销时都需要登录邮箱&#xff0c;点开邮件&#xff0c;一个个下载整理&#xff0c;工作量不大&#xff0c;但是发票多了也着实很烦。这个月终于下决心把这个过程自动化一…

《005.SpringBoot+vue之学生选课管理系统01》

《005.SpringBootvue之学生选课管理系统01》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 管理端 1…

BO(Business Object)是一种用于表示业务对象的设计模式

1、Service层 BO 1.1、FruitService接口 package com.csdn.fruit.service; import com.csdn.fruit.dto.PageInfo; import com.csdn.fruit.dto.PageQueryParam; import com.csdn.fruit.pojo.Fruit; public interface FruitService {PageInfo<Fruit> getFruitPageInfo(Page…

C++性能优化笔记-6-C++元素的效率差异-7-类型转换

C元素的效率差异 类型转换signed与unsigned转换整数大小转换浮点精度转换整数到浮点转换浮点到整数转换指针类型转换重新解释对象的类型const_caststatic_castreinterpret_castdynamic_cast转换类对象 类型转换 在C语法中&#xff0c;有几种方式进行类型转换&#xff1a; // …

unity【动画】脚本_角色动画控制器 c#

首先创建一个代码文件夹Scripts 从人物角色Player的基类开始 创建IPlayer类 首先我们考虑到如果不挂载MonoBehaviour需要将角色设置成预制体实例化到场景上十分麻烦&#xff0c; 所以我们采用继承MonoBehaviour类的角色基类方法写代码 也就是说这个脚本直接绑定在角色物体…

VBA之正则表达式(44)-- 拆分商品和规格

实例需求&#xff1a;商品组清单保存在A列中&#xff0c;现需要将其拆分为商品名称&#xff0c;保存在从B列开始的后续单元格中&#xff0c;部分商品包含规格&#xff0c;并且多种规格属性使用了逗号分隔&#xff0c;因此无法直接使用Excel分列功能完成数据拆分。 示例代码如下…

“第六十一天”

这三个也算一类的&#xff0c;减和加的处理差不多&#xff0c;不过这个题多了限制是被减数大于减数&#xff0c;要是想再完整一点&#xff0c;可以把小于的情况也考虑进去&#xff0c;不过这个我是如果被减数小于减数的话&#xff0c;我就用减数加被减数&#xff0c;然后最后打…

【MySQL数据库】 四

本文主要介绍了mysql数据库的几种常见的约束. 一.数据库约束 我们希望存储的数据是靠谱的,mysql提供一些机制来辅助我们自动的依赖程序对数据进行检查 . 这类查数据的机制,就是约束 一旦约束好了,后续在进行增 删 改的时候,mysql就会自动的对修改的数据做出检查,如果不符合…

wscat

wscat 是一个用于 WebSocket 通信测试的命令行工具 安装wscat flynnsinflynnsin:~$ sudo npm install -g wscat loadDep:ws → afterAdd ▄ ╢████████████████████████████████████░░░░░░░░░░░░░░░░░░░░░░░…

爱上C语言:函数递归,青蛙跳台阶图文详解

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;生活本来沉闷&#xff0c;但跑起来就有风 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请…

大数据毕业设计选题推荐-旅游景点游客数据分析-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

修复RGBA的png为RGB的png

修改IHDR里面的color type 修改IHDR的crc 删除sBit和sRGB两个chunk

linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、Wi-Fi热点

linux中各种最新网卡2.5G网卡驱动&#xff0c;不同型号的网卡需要不同的驱动&#xff0c;整合各种网卡驱动&#xff0c;包括有线网卡、无线网卡、自动安装Wi-Fi热点。 最近在做路由器二次开发&#xff0c;现在市面上卖的新设备&#xff0c;大多数都采用了2.5G网卡&#xff0c;…