华为OD机试 - 任务最优调度 - 深度优先搜索dfs算法(Java 2023 B卷 200分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
      • 3、说明
    • 四、解题思路
      • 1、题目解读
      • 2、解题思路
      • 3、具体步骤
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
        • 思路分析
        • 执行顺序

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

专栏导读

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

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

一、题目描述

给定一个正整数数组表示待系统执行的任务列表,数组的每一个元素代表一个任务,元素的值表示该任务的类型。

请计算执行完所有任务所需的最短时间。

任务执行规则如下

  1. 任务可以按任意顺序执行,且每个任务执行耗时间均为1个时间单位;
  2. 两个同类型的任务之间必须有长度为N个单位的冷却时间,比如N为2时,在时间K执行了类型3的任务,那么K+1和K+2两个时间不能执行类型3任务;
  3. 系统在任何一个单位时间内都可以执行一个任务,或者等待状态。

说明:数组最大长度为1000,速度最大值1000。

二、输入描述

第一行记录一个用半角逗号分隔的数组,数组长度不超过1000,数组元素的值不超过1000。第二行记录任务冷却时间,N为正整数,N<=100。

三、输出描述

输出为执行完所有任务所需的最短时间。

1、输入

2,2,2,3
2

2、输出

7

3、说明

  1. 时间1:执行任务2
  2. 时间2:执行任务3,因为冷却时间为2,所以时间2不能执行任务2
  3. 时间3:系统等待,因为冷却时间为2,所以时间3不能执行任务1和任务2
  4. 时间4:执行任务2
  5. 时间5:系统等待
  6. 时间6:系统等待
  7. 时间7:执行任务2

四、解题思路

1、题目解读

  1. 每个任务执行耗时间均为1个时间单位
  2. 两个同类型的任务之间必须有长度为N个单位的冷却时间
  3. 输出为执行完所有任务所需的最短时间。

2、解题思路

因为任务有冷却时间,为了缩短冷却时间,任务数量多的应该先执行。

3、具体步骤

  1. 第一行输入若干个任务;
  2. 定义任务编号与数量关系的Map(key:任务编号,value:任务数量,冷却时间,并进行数据初始化;
  3. 冷却时间说明:
    • 未执行的任务,默认-1;
    • 执行的任务,默认为coolingTime;
    • 每执行一个任务,-1;
  4. 第二行输入冷却时间coolingTime;
  5. 定义加入执行的任务列表builder;
  6. 通过深度优先搜索dfs进行任务最优调度;
    • 如果任务列表为空,则停止搜索;
    • 获取优先执行的任务,任务优先执行的条件:(①为了缩短冷却时间,任务数量多的应该先执行;②不处于冷却时间内);
      • 定义满足条件的待执行任务maxTask;
      • 遍历map,获取任务数量和任务冷却时间;
      • 如果任务数量最多 and 不处于冷却时间内,获取优先执行的任务;
      • 处于冷却时间内的任务,冷却时间-1;
      • 返回优先执行的任务编号;
  7. 如果获取到了优先执行的任务编号;
    • 将该任务的数量-1;
    • 冷却时间置为coolingTime;
    • 如果任务数量-1后,等于0,表示该任务执行完毕,从map中移除;
  8. 将优先执行的任务编号加入builder,如果没有获取到可以优先执行的任务,将默认值“wait”加入到builder,表示占位;
  9. 最后输出为执行完所有任务所需的最短时间。

五、Java算法源码

public class OdTest02 {
    static int coolingTime = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 若干个任务
        String[] taskArr = sc.nextLine().split(",");
        /**
         * key:任务编号
         * value:任务数量,冷却时间
         * 冷却时间说明:
         * 未执行的任务,默认-1
         * 执行的任务,默认为coolingTime
         * 每执行一个任务,-1
         */
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < taskArr.length; i++) {
            String task = taskArr[i];
            Integer sum = 0;
            if (map.containsKey(task)) {
                sum = Integer.valueOf(map.get(task).split(",")[0]);
            }
            sum++;
            map.put(task, sum+","+(-1));
        }

        // 冷却时间
        coolingTime = Integer.valueOf(sc.nextLine());

        // 搜索任务数量最多 且不处于冷却时间的任务 去执行
        dfs(map);

        System.out.println(builder.deleteCharAt(builder.length()-1));
        System.out.println(builder.toString().split(",").length);
    }

    // 加入执行的任务列表
    static StringBuilder builder = new StringBuilder();

    /**
     * 搜索任务数量最多 且不处于冷却时间的任务 去执行
     */
    private static void dfs(Map<String, String> map) {
        // 如果任务列表为空,则停止搜索
        if(map.size() == 0){
            return;
        }

        String maxTask = getMaxTask(map);
        if(!maxTask.equals("wait")){
            String value = map.get(maxTask);
            int sum = Integer.valueOf(value.split(",")[0]);
            sum--;
            if(sum > 0){
                map.put(maxTask,sum + "," + coolingTime);
            }else{
                map.remove(maxTask);
            }
        }

        builder.append(maxTask).append(",");
        // 搜索任务数量最多 且不处于冷却时间的任务 去执行
        dfs(map);
    }

    /**
     * 任务执行的条件:
     * 1. 为了缩短冷却时间,任务数量多的应该先执行
     * 2. 不处于冷却时间内
     */
    private static String getMaxTask(Map<String, String> map) {
        // 满足条件的待执行任务
        String maxTask = "wait";
        Integer maxValue = -1;
        for (Map.Entry<String,String> entry : map.entrySet()) {
            // 任务数量
            int sum = Integer.valueOf(entry.getValue().split(",")[0]);
            // 任务冷却时间
            int cool = Integer.valueOf(entry.getValue().split(",")[1]);
            // 任务数量最多 and 不处于冷却时间内
            if (sum > maxValue && cool<=0) {
                maxTask = entry.getKey();
                maxValue = sum;
            }

            // 处于冷却时间内的任务,冷却时间-1
            if(cool > 0){
                cool--;
                map.put(entry.getKey(),sum + "," + cool);
            }
        }
        return maxTask;
    }
}

六、效果展示

1、输入

2,2,3,2,3,3,4,4,5
3

2、输出

10

3、说明

思路分析
  1. 获取每个任务编号对应的数量3个2、3个3、2个4,1个5;
  2. 优先执行任务2或任务3,都可以;
执行顺序
  1. 时间1:执行任务2
  2. 时间2:执行任务3,因为冷却时间为3,所以时间2不能执行任务2
  3. 时间3:执行任务4,因为冷却时间为3,所以时间2不能执行任务2、任务3
  4. 时间4:执行任务5,因为冷却时间为3,所以时间2不能执行任务2、任务3、任务4
  5. 时间5:此时还剩2个任务2、2个任务3、1个任务4,优先执行任务数量最多的,并且只有任务2不处于冷却时间内,所以执行任务2
  6. 时间6:优先执行任务数量最多的,并且只有任务3不处于冷却时间内,所以执行任务3
  7. 时间7:执行任务4
  8. 时间8:此时只剩任务2和任务3,但都处于冷却时间,故系统等待;
  9. 时间9:执行任务2
  10. 时间10:执行任务3
  11. 执行的任务顺序为2,3,4,5,2,3,4,wait,2,3;
  12. 最后输出10

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

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

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

在这里插入图片描述

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

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

相关文章

Vue3+Ts项目(Naive UI组件)——创建有图标可伸缩的左边菜单栏

文章目录 安装、配置vue-router1、安装2、main.ts配置3、在App.vue中&#xff0c;渲染路由配置到的组件 创建测试路径页面1、src\views\dashboard\index.vue2、src\views\dashboard\test.vue3、src\views\table\index.vue 配置页面路由1、src\router\modules\dashboard.ts2、sr…

Java-----链表

本篇碎碎念&#xff1a;唐朝诡事录中的西安与洛阳让我想到了&#xff0c;远赴人间惊鸿宴会&#xff0c;一睹人间盛世颜&#xff0c;描绘的就是这两个古都吧&#xff0c;有机会一定要去游览一番 今日份励志文案: 最好的状态就是向自己喜欢的东西一点点靠近 …

基于SSM的OA办公系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

在线免费压缩pdf文件

在线免费压缩pdf文件&#xff0c;不用登陆哦&#xff0c; https://www.ilovepdf.com/ https://online2pdf.com/#

IPIDEA科普大数据企业怎样使用IP代理工具进行数据抓取

相信有很多的朋友都很好奇一件事&#xff0c;一般大数据企业需要拥有海量的数据才能够进行数据分析整理和利用&#xff0c;那么他们都是如何抓取到这么多的数据呢&#xff1f;这些企业在抓取数据时都会使用什么工具&#xff0c;今天就跟大家科普一下。 其实大数据企业在进行数…

uniapp x 相比于其他的开发系统框架怎么样?

首先我们要知道niapp这是一种基于Vue.js开发的跨平台应用框架&#xff0c;可以将同一套代码同时运行在多个平台上&#xff0c;包括iOS、Android、H5等。相比其他开发系统框架&#xff0c;他有什么优点呢&#xff1f;让我们共同探讨一下吧&#xff01; 图片来源&#xff1a;unia…

《数据结构、算法与应用C++语言描述》-最大高度优先左高树-C++实现

左高树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_26maxHblt 定义 (大顶堆和小顶堆)堆结构是一种隐式数据结构(implicit data structure)。用完全二叉树表示的堆在数组中是隐式存储的(即没有明确的指针或其他数据能够用来重塑…

HTML5+CSS3+JS小实例:可拖拽排序的人物列表

实例:可拖拽排序的人物列表 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=…

关东升老师极简系列丛书(由清华大学出版社出版)

极简系列丛书&#xff0c;编程学习新体验 在这个科技日新月异的时代&#xff0c;编程已经成为了一种必备技能。但是面对各种复杂的编程语言&#xff0c;你是否也曾感到过迷茫和困惑&#xff1f;由清华大学出版社出版的“极简系列丛书”就是为了帮助你解决这个问题。 这套丛书…

抖捧自动直播是什么,系统功能讲解

目前有在做实体行业级商家服务的老板 你还在为不会直播&#xff0c;不敢直播而苦恼吗&#xff1f; 你还在为想做直播&#xff0c;但没空开直播而焦灼吗&#xff1f; 今天&#xff0c;你的问题都可以统统解决 实体行业直播必备黑科技&#xff1a;抖捧AI自动直播 只需要一部手…

3号线开通在即, 你的「搭子」找好了吗?

搭子合伙者抱有同样目的的人 “搭子”作为一种新型社交关系和社交方式&#xff0c;正在年轻人当中盛行。 浅于朋友&#xff0c;重于同事&#xff0c; 主打“垂直领域”和“精准陪伴”。 不同场合大家都有专属“搭子”&#xff0c; “周末去孔学堂感受传统文化的研学搭子”“…

51单片机控制1602LCD显示屏输出两行文字一

51单片机控制1602LCD显示屏输出两行文字一 1.概述 这篇文章介绍1602型号显示屏的基础知识&#xff0c;以及使用单片机控制它输出两行内容。 2.1602基础知识 1602 液晶显示模块是一种通用的工业液晶显示模块&#xff0c;专门用来显示字母、数字、符号等的点阵型液晶显示模块…

宝塔PostgreSQL设置数据库远程访问

宝塔PostgreSQL设置数据库远程访问 宝塔的PostgreSQL1. 添加数据库2. 打开PostgreSQL设置界面3. 修改配置4. 重载配置/重启数据库 Docker的PostgreSQL1. postgresql.conf2. pg_hba.conf3. 重启数据库 注意其他问题 宝塔PostgreSQL设置数据库远程访问&#xff1f;docker容器Post…

软件设计师——计算机网络(二)

&#x1f4d1;前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

纳管虚拟化 | ZStack Cube超融合一体机助力南京财经高职校智慧校园

数字经济正加速推动各行各业的高质量升级发展&#xff0c;云计算是数字经济的核心底层基础设施。作为云基础软件企业&#xff0c;云轴科技ZStack 坚持自主创新&#xff0c;自研架构&#xff0c;产品矩阵可全面覆盖数据中心云基础设施&#xff0c;针对虚拟化资源实现纳管、替代和…

微软自带浏览器Edge,无法关闭“保存历史记录网站的屏幕截图”解决方案

微软自带浏览器Edge&#xff0c;无法关闭“保存历史记录网站的屏幕截图”解决方案 吐槽1&#xff1a;Windows自带的Chrome内核版本的浏览器Microsofg Edge刚发布时可谓一股清流&#xff0c;启动速度快&#xff0c;占用内存较小&#xff0c;相信很多人也开始抛弃正代Chrome&…

翻译: 生成式人工智能项目的生命周期 Lifecycle of a generative AI project

我将分享一下构建生成式AI软件应用程序的过程。首先&#xff0c;我们会确定项目范围&#xff0c;决定软件要实现的功能。例如&#xff0c;你可能决定建立一个餐厅声誉监控系统。接下来是实际的实施阶段。由于生成式AI使构建应用程序变得容易&#xff0c;你通常可以很快构建出一…

一文读懂Java中的设计模式——模板方法,给大家的代码添点料!

模板方法概念 模板设计模式是类的行为模式。准备一个抽象类&#xff0c;将部分逻辑以具体方法以及具体构造函数的形式实现&#xff0c;然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法&#xff0c;从而对剩余的逻辑有不同的实现。…

给一个容器添加el-popover/el-tooltip内容提示框

效果&#xff1a; html: <div class"evaluate"><div class"list flex-column-center" v-for"(item, index) in evaluateList" :key"index"mouseenter"mouseenterHandler(item)" mouseleave"mouseleaveHandle…