华为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>() {@Overridepublic 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在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 157 (Rated for Div. 2) F. Fancy Arrays(容斥+组合数学)

题目 称一个长为n的数列a是fancy的&#xff0c;当且仅当&#xff1a; 1. 数组内至少有一个元素在[x,xk-1]之间 2. 相邻项的差的绝对值不超过k&#xff0c;即 t(t<50)组样例&#xff0c;每次给定n(1<n<1e9),x(1<x<40), 求fancy的数组的数量&#xff0c;答案…

Spring Boot 3系列之-启动类详解

Spring Boot是一个功能强大、灵活且易于使用的框架&#xff0c;它极大地简化了Spring应用程序的开发和部署流程&#xff0c;使得开发人员能够更专注于业务逻辑的实现。在我们的Spring Boot 3系列之一&#xff08;初始化项目&#xff09;文章中&#xff0c;我们使用了Spring官方…

打印机:Open the front cover and pull out the drum unit

参考&#xff1a; https://support.brother.com/g/b/faqend.aspx?cgb&langen&prodmfcl8690cdw_eu_as&faqidfaq00000154_082#:~:textReplacing%20the%20drum%20unit%20Make%20sure%20the%20machine,unit%20out%20of%20the%20machine%20until%20it%20stops. 故障现…

Box2d 物理画线,Cocos Creator 3.8

一个简易的画线刚体Demo 效果 抱歉&#xff0c;放错图了&#xff0c;以上是 孙二喵 iwae https://forum.cocos.org/t/topic/142673[1] 的效果图。本Demo是根据文章的思路&#xff0c;合成的代码。首先&#xff0c;感谢孙二喵的技术分享。 以下是最终效果图 使用 版本 Cocos Cre…

产业园区中工业厂房的能源综合配置——工业园区综合能源数字化系统建设方案

以下内容转自微信公众号&#xff1a;PPP产业大讲堂&#xff0c;《产业园区中工业厂房的能源综合配置》。 园区工业地产中能源综合配置存在的问题 我国园区工业地产建设已历经近40年的发展, 园区在区域经济发展、产业集聚方面发挥了重要的载体和平台作用, 有力推动了我国社会经…

尚硅谷Docker基础篇和Dockerfile超详细整合笔记

Docker基础篇DockerFile Docker&#xff1a;您要如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f;而这个就是使用容器。Docker解决了运行环境和配置问题…

SMART PLC开放式以太网通信(UDP通信)

西门子S7-200 SMART PLC不仅支持开放式以太网通信,还支持MODBU-RTU,以及ModbusTcp通信,详细内容请参考下面文章: MODBUS-RTU主站通信 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客文章浏览阅读2.5k次,点赞5次,收藏10次。MODBUS通讯…

NVIDIA-SMI has failed because it couldn“t communicate with the NVIDIA driver .

文章目录 报错原因分析解决办法防患于未然 报错 执行nvidia-smi报错 NVIDIA-SMI has failed because it couldn"t communicate with the NVIDIA driver . Make sure that the atest NVIDIA driver is installed and running.运行使用gpu的docker容器时 NVIDIA Docker …

【小白专用】PHP基本语法 23.11.04

PHP基本语法 PHP是超文本预处理器 由服务器解析执行 可以与 html 进行混编(嵌入) ,PHP是一种弱类型语言 1.1 PHP标记 PHP和其他Web语言一样&#xff0c;都是用一对标记将PHP代码包含起来&#xff0c;以便和HTML代码区分开来。PHP支持4种风格的标记&#xff0c;如表所示。 标…

从零开始搭建微服务(一)

构建项目父工程 添加公共核心模块 安装nacos 安装nacos nacos 文档地址&#xff1a; https://nacos.io/zh-cn/docs/what-is-nacos.html 本文使用版本2.2.2 下载地址&#xff1a;https://github.com/alibaba/nacos/archive/refs/tags/2.2.2.zip 使用nacos 我们下载是源代码 解…

shell脚本代码混淆

文章目录 起因安装 Bashfuscator安装BashfuscatorBashfuscator的使用 起因 很多时候我并不希望自己的shell脚本被别人看到&#xff0c;于是我在想有没有什么玩意可以把代码加密而又正常执行&#xff0c;于是我想到了代码混淆&#xff0c;简单来看一下&#xff1a; 现在我的目…

自动识别图片文字表格:高效神器,告别繁琐手动操作

现代科技的快速发展为我们的生活带来了许多便利和效率提升。在数据处理和文档管理方面&#xff0c;自动化技术也日益成熟和普及。一项非常有用的技术是自动识别文字生成表格&#xff0c;它可以将大量的图片识别成文本并转换为表格形式&#xff0c;使得数据的整理和分析更加简便…