华为OD机试 - 最少面试官数 - 深度优先搜索dfs(Java 2023 B卷 200分)

news2024/10/1 15:23:10

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
      • 3、说明
    • 四、解题思路
      • 1、核心思路:
      • 2、具体步骤
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
        • 按照面试的开始时间升序排序,如果开始时间相同,按照结束时间的升序排序
      • 2、输出
      • 3、说明

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

专栏导读

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

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

一、题目描述

某公司组织一场公开招聘活动,假设由于人数和场地的限制,每人每次面试的时长不等, 并已经安排给定,用(S1,E1)、(S2,E2)(Sj,Ej)…(Si< Ei,均为非负整数)表示每场面试的开始和结 束时间。

面试采用一对一的方式,即一名面试官同时只能面试一名应试者,一名面试官完成一次 面试后可以立即进行下一场面试,且每个面试官的面试人次不超过 m。 为了支撑招聘活动高效顺利进行,请你计算至少需要多少名面试官。

二、输入描述

输入的第一行为面试官的最多面试人次 m,第二行为当天总的面试场次 n

接下来的 n 行为每场面试的起始时间和结束时间,起始时间和结束时间用空格分隔.

其中,1 <= n,m <= 500

三、输出描述

输出一个整数,表示至少需要的面试官数量。

1、输入

2 4
8 10
11 13
10 12
12 13

2、输出

3

3、说明

  1. 第一个面试官,面试第一场8 10、第三场10 12
  2. 第二个面试官,面试第二场11 13
  3. 第三个面试官,面试第四场12 13

四、解题思路

1、核心思路:

寻找每一位面试官可以面试的符合要求的所有场次。

2、具体步骤

  1. 输入一个面试官的最多面试人次m,当天总的面试场次n;
  2. 接下来的n行输入面试起始时间和结束时间,将其加入arrList;
  3. 按照面试的开始时间升序排序,如果开始时间相同,按照结束时间的升序排序;
  4. 深度优先搜索,获取面试官数量;
    • 搜索完所有面试,即结束;
    • 获取当前面试官的最新一次面试preArr;
    • 当前面试官,面试次数+1;
    • 遍历其余场次,如果下一场符合要求;
      • 如果下一场符合要求;
      • 当前面试官,面试次数+1;
      • 因为remove的原因,i-1;
      • 重置当前面试官的最新一次面试;
    • 如何当前时间不符合面试官要求,则比较下一场;
  5. 搜索完当前面试官后,面试官数量+1
  6. 寻找下一个面试官合适的面试场次;
  7. 最后输出面试官数量sum。

五、Java算法源码

public class OdTest {
    // 一个面试官的最多面试人次
    static int m = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] input = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // 一个面试官的最多面试人次
        m = input[0];
        // 当天总的面试场次
        int n = input[1];

        // 每场面试的时间集合
        List<Integer[]> arrList = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            Integer[] arr = Arrays.stream(sc.nextLine().split(" ")).map(Integer::valueOf).toArray(Integer[]::new);
            arrList.add(arr);
        }

        // 按照面试的开始时间升序排序,如果开始时间相同,按照结束时间的升序排序
        Collections.sort(arrList, new Comparator<Integer[]>() {
            @Override
            public int compare(Integer[] o1, Integer[] o2) {
                if(o1[0] > o2[0]){
                    return 1;
                }else if(o1[0] < o2[0]){
                    return -1;
                }else{
                    if(o1[1] > o2[1]){
                        return 1;
                    }else if(o1[1] < o2[1]){
                        return -1;
                    }else {
                        return 0;
                    }
                }
            }
        });

        // 深度优先搜索,获取面试官数量
        dfs(arrList);

        System.out.println(sum);
    }

    // 面试官数量
    static int sum = 0;
    // 一个面试官的面试次数
    static int times = 0;

    private static void dfs(List<Integer[]> arrList){
        // 搜索完所有面试,即结束
        if(arrList.size() == 0){
            return;
        }

        // 当前面试官的最新一次面试
        Integer[] preArr = arrList.get(0);
        arrList.remove(0);
        System.out.println("第"+(sum+1)+"位面试官,面试的场次:"+preArr[0] + " " + preArr[1]);
        // 当前面试官,面试次数+1
        times++;
        for (int i = 0; i < arrList.size(); i++) {
            // 一个面试官的最多面试人次
            if(times == m){
                times = 0;
                break;
            }

            Integer[] nextArr = arrList.get(i);
            if(preArr[1] <= nextArr[0]){
                arrList.remove(i);
                // 当前面试官,面试次数+1
                times++;
                // 因为remove的原因,i-1
                i--;
                // 重置当前面试官的最新一次面试
                preArr = nextArr;
                System.out.println("第"+(sum+1)+"位面试官,面试的场次:"+preArr[0] + " " + preArr[1]);
            }else{
                // 如何当前时间不符合面试官要求,则比较下一场
                continue;
            }
        }

        // 面试官数量+1
        sum++;
        // 下一个面试官面试场次归0
        times = 0;
        // 寻找下一个面试官合适的面试场次
        dfs(arrList);
    }
}

六、效果展示

1、输入

3 7
8 10
10 12
10 12
7 10
13 15
7 9
9 10

按照面试的开始时间升序排序,如果开始时间相同,按照结束时间的升序排序

3 7
7 9
7 10
8 10
9 10
10 12
10 12
13 15

2、输出

3

3、说明

  • 第1位面试官,面试的场次:7 9
  • 第1位面试官,面试的场次:9 10
  • 第1位面试官,面试的场次:10 12
  • 第2位面试官,面试的场次:7 10
  • 第2位面试官,面试的场次:10 12
  • 第2位面试官,面试的场次:13 15
  • 第3位面试官,面试的场次:8 10

在这里插入图片描述


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

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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KHBC靶场-->打不穿?笑死

最近这不是在上文件上传的课吗&#xff1f;刚好老师也布置了一堆靶场&#xff0c;刚好来挑一个显眼包 没错他就是KHBC靶场&#xff01;&#xff01;&#xff08;看他不顺眼很久了…

智能变电站协议系列-2、SV/SMV协议示例(IEC61850)以及5G专网下的电力方案分析

文章目录 一、前言二、资料准备三、libiec61850的SV运行示例及抓包分析1、单独编译示例程序2、运行示例程序及5G专网场景下部署3、wireshark抓包分析 四、最后 一、前言 之前我们对IEC61850协议有了整体的了解&#xff0c;对一些概念有了一定的认识&#xff0c;并针对GOOSE协议…

c++代码寻找USB00端口并添加打印机

USB00*端口的背景 插入USB端口的打印机&#xff0c;安装打印机驱动&#xff0c;在控制面板设备与打印机处的打印机对象上右击&#xff0c;可以看到打印机端口。对于不少型号&#xff0c;这个端口是USB001或USB002之类的。 经观察&#xff0c;这些USB00*端口并不是打印机驱动所…

每日一题——LeetCode859

方法一 个人方法&#xff1a; 首先s和goal要是长度不一样或者就只有一个字符这两种情况可以直接排除剩下的情况s和goal的长度都是一样的&#xff0c;s的长度为2也是特殊情况&#xff0c;只有s的第一位等于goal的第二位&#xff0c;s的第二位等于goal的第一位才能满足剩下的我们…

tensorboard可视化——No dashboards are active for the current data set.

No dashboards are active for the current data set. 出现问题的原因是事件的路径未用绝对路径&#xff0c;tensorboard --logdir./runs --port6007 改为tensorboard --logdirD:\Code\Python\Study\CL\hat-master\hat-master\run s\one --port6007就好了

Linux操作系统基础(一)系统和软件的安装

Linux操作系统简介 Linux是一种自由和开放源码的类Unix操作系统。该操作系统的内核由芬兰人林纳斯托瓦兹在1991年10月5日首次发布&#xff0c;再加上用户空间的应用程序之后&#xff0c;就成为了Linux操作系统。Linux也是自由软件和开放源代码软件发展中最著名的例子。 Linux…

Tomcat与Netty比较

Tomcat介绍Tomcat支持的协议Tomcat的优缺点Netty介绍Netty支持的协议Netty的优点和缺点Tomcat和Netty的区别Tomcat和Netty的应用场Tomcat和Netty来处理大规模并发连接的优化Tomcat与Netty的网络模型的区别Tomcat与Netty架构设计拓展 Tomcat介绍 Tomcat是一个免费的、开放源代码…

Matlab-修改默认启动路径

Matlab-修改默认启动路径 第一:找到MATLAB的安装路径 第二步&#xff1a;进入到…\toolbox\local下&#xff0c;找到matlabrc.m 第三部&#xff1a;编辑matlabrc.m&#xff0c;在文本最后一行加入启动文件路径

应急响应中的溯源方法

在发现有入侵者后&#xff0c;快速由守转攻&#xff0c;进行精准地溯源反制&#xff0c;收集攻击路径和攻击者身份信息&#xff0c;勾勒出完整的攻击者画像。 对内溯源与对内溯源 对内溯源&#xff1a;确认攻击者的行为 &#xff0c;分析日志 数据包等&#xff1b; 对外溯源&…

Flutter中鼠标 onEnter onExit onHover 实现代码分析

生活会给你任何最有益的经历&#xff0c;以助你意识的演变。 转载请注明出处: 这里对最近用到的一些 Flutter 开源的东西进行总结积累&#xff0c;希望能帮助到大家。 文章目录 背景测试代码flutter 代码onEnter & onExitonHover end 背景 Android设备在使用的时候&#…

3.认识HTML

一、HTML是什么&#xff1f; 超&#xff1a;超链接 二、W3C制定了HTML规范 2014年HTML5正式发布 三、HTML初体验 四、老师常用网站

大数据---35.HBase 常用的api的具体解释

Hbase是一个分布式的、面向列的开源数据库&#xff0c;HDFS文件操作常有两种方式&#xff0c;一种是命令行方式&#xff0c;即Hbase提供了一套与Linux文件命令类似的命令行工具。另一种是JavaAPI&#xff0c;即利用Hbase的Java库&#xff0c;采用编程的方式操作Hbase数据库。 …

红队攻防实战之DC1

如果额头终将刻上皱纹&#xff0c;你只能做到&#xff0c;不让皱纹刻在你的心上 0x01 信息收集: 1.1 端口探测 使用nmap工具 端口扫描结果如下&#xff1a; 由nmap扫描可以知道&#xff0c;目标开放了22,80,111,46204端口&#xff0c;看到端口号22想到ssh远程连接&#xff…

docker部署mysql主主备份 haproxy代理(swarm)

docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; docker部署mysql主主备份 docker部署mysql主主备份&#xff08;keepalived&#xff09;跨主机自动切换 docker部署mysql主主备份 haproxy代理&#xff08;swarm&#xff09; 1. 环境准备 主机IPnode119…

【贪心】最小生成树Prim算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Prim算法Prim算法的正确性时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;贪心算法 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图&#xff0c; E E E中每条边 ( v , w ) (v , w) (v,w)的…

多线程的基本使用与多线程中条件变量的使用——消费者生产者问题实例

多线程的基本使用与多线程中条件变量的使用——消费者生产者问题实例 本文主要涉及多线程的使用方法&#xff0c;通过两个实例来对多线程的使用进行理解&#xff0c; 案例包括&#xff1a; 1.一个线程负责计数&#xff0c;另一个线程负责打印计数值 2.消费者生产者问题 文章目录…

【MySQL索引特性】

目录&#xff1a; 前言引入认识磁盘MySQL与存储 索引的理解理解单个Page理解多个Page引入B树结构聚簇索引 VS 非聚簇索引 索引操作创建主键索引唯一索引的创建普通索引的创建查看索引删除索引 总结 前言 剑指offer&#xff1a;一年又10天 引入 索引&#xff0c;是用来提高查询…

【python】python课设 天气预测数据分析及可视化(完整源码)

目录 1. 前言2. 项目结构3. 详细介绍3.1 main.py3.2 GetModel.py3.3 GetData.py3.4 ProcessData.py3.5天气网.html 4. 成果展示 1. 前言 本文介绍了天气预测数据分析及可视化的实现过程使用joblib导入模型和自定义模块GetModel获取模型&#xff0c;输出模型的MAE。使用pyechart…

ansible的控制语句

本章内容主要介绍 playbook 中的控制语句 使用when判断语句block-rescue判断循环语句 一个play中可以包含多个task&#xff0c;如果不想所有的task全部执行&#xff0c;可以设置只有满足某个条件才执行这个task&#xff0c;不满足条件则不执行此task。本章主要讲解when 和 blo…

Linux安装及管理程序

一、Linux应用程序管理 1、应用程序与系统命令的关系 1.对比系统命令和应用程序的不同 位置&#xff1a; Linux中一切皆为文件 演示内部命令和外部命令 位置 应用程序位置 用途&#xff1a; 命令主要处理系统的基本操作&#xff08;复制&#xff0c;配置&#xff09; 应用程…