华为OD机试 - 报文响应时间 - 贪心算法、位运算(Java 2024 E卷 200分)

news2024/11/13 3:46:35

在这里插入图片描述

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

专栏导读

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

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

IGMP协议中, 有一个字段称作最大响应时间 (Max Response Time), HOST 收到查询报文, 解析出 MaxResponseTime 字段后, 需要在 (0, MaxResponseTime] 时间 (s) 内选取随机时间回复一个响应报文, 如果在随机时间内收到一个新的查询报文, 则会根据两者时间的大小, 选取小的一方刷新响应时间。

最大响应时间有如下计算方式:

  • 当 Max Resp Code < 128, Max Resp Time = Max Resp Code;
  • 当 Max Resp Code ≥ 128, Max Resp Time = (mant | 0x10) << (exp + 3);

在这里插入图片描述

注:

exp 最大响应时间的高5~7位: mant 为最大响应时间的低4位。

其中接收到的 MaxRespCode 最大值为 255, 以上出现所有字段均为无符号数。

现在我们认为 HOST 收到查询报文时, 选取的随机时间必定为最大值, 现给出 HOST 收到查询报文个数 C, HOST 收到该报文的时间 T, 以及查询报文的最大响应时间字段值 M, 请计算出 HOST 发送响应报文的时间。

二、输入描述

第一行为查询报文个数 C, 后续每行分别为 HOST 收到报文时间 T, 及最大响应时间 M, 以空格分割。

三、输出描述

HOST 发送响应报文的时间。

备注

用例确定只会发送一个响应报文, 不存在计时结束后依然收到查询报文的情况。

四、测试用例

测试用例1:

1、输入

3
0 20
1 10
8 20

2、输出

11

3、说明

收到3个报文,

  • 第0秒收到第1个报文,响应时间为20秒,则要到0+20=20秒响应;
  • 第1秒收到第2个报文,响应时间为10秒,则要到1+10=11秒响应,与上面的报文的响应时间比较获得响应时间最小为11秒;
  • 第8秒收到第3个报文,响应时间为20秒,则要到8+20=28秒响应,与第上面的报文的响应时间比较获得响应时间最小为11秒;

最终得到最小响应报文时间为11秒

测试用例2:

1、输入

2
0 255
200 60

2、输出

260

3、说明

收到2个报文,

  • 第0秒收到第1个报文,响应时间为255秒,则要到(15 | 0x10) << (7 + 3)=31744秒响应;(mant = 15,exp = 7)
  • 第200秒收到第2个报文,响应时间为60秒,则要到200+60=260秒响应,与第上面的报文的响应时间比较获得响应时间最小为260秒;

最终得到最小响应报文时间为260秒

五、解题思路

1、贪心算法

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前最优解的算法。它的思想是每一步都做出一个局部最优的选择,以期望通过局部最优解推导出全局最优解。贪心算法通常用于优化问题中,它不回溯,即不会重新考虑之前做出的选择,因此效率较高。

贪心算法的典型特点是:总是选择在当前情况下最优的解,而不考虑全局最优解的可能性。这个策略在有些问题中可以得到全局最优解,但在其他问题中则只能得到近似解。

2、贪心算法适用哪些场景?

贪心算法适用于那些具有贪心选择性质和最优子结构性质的问题。

贪心选择性质:每次的局部最优选择,最终可以得到问题的全局最优解。

最优子结构性质:问题的最优解包含了其子问题的最优解,也就是通过解决子问题可以得到全局最优解。

以下是一些经典的贪心算法适用场景:

  1. 最小生成树问题(Minimum Spanning Tree):
    • 如 Prim 算法、Kruskal 算法等,它们通过贪心策略选取当前权重最小的边来构建最小生成树。
  2. 单源最短路径问题:
    • Dijkstra 算法是典型的贪心算法应用,它在每一步选取距离当前源节点最近的节点进行处理,逐步找出最短路径。
  3. 活动选择问题:
    • 给定一系列需要在特定时间内进行的活动,活动之间可能会冲突。贪心算法选择开始时间最早且结束时间最短的活动,使得能够安排最多的活动。
  4. 背包问题(贪心解法):
    • 背包问题中,贪心算法通过选择单位价值最高的物品,试图最大化背包能装下的总价值(这是近似解,而非最优解,适用于"分数背包问题")。
  5. 霍夫曼编码:
    • 霍夫曼编码用于数据压缩。它通过贪心策略构建一个最优的二叉树,使得字符的编码长度最短。
  6. 区间调度问题:
    • 当你有一系列的任务或活动,每个活动有开始时间和结束时间,目的是在不重叠的情况下安排尽可能多的活动。通过选择最早结束的活动,贪心策略可以找到最优解。

3、为什么采用贪心算法?

每当 HOST 收到一个新的查询报文时,需要重新计算它的响应时间,且会选择在所有报文中最小的响应时间作为最终的响应时间。

题目要求在每次收到新的查询报文时,根据已有报文的响应时间和当前报文的最大响应时间,做出局部最优选择——即选择两者中较小的响应时间来更新最终响应时间。这正是贪心算法的核心思想:每一步都选择当前的最优解(最小响应时间),逐步逼近全局最优解。

在这个问题中,我们始终可以通过对比每个报文的响应时间,选择最小的那个作为当前的最优解,这样不断更新,直到处理完所有报文,最终得到全局最优的响应时间。

4、详细步骤

  1. 读取输入:首先读取输入的查询报文个数 C 以及每条报文的时间 T 和最大响应时间字段 M。
  2. 计算最大响应时间:根据题目的描述,如果 MaxRespCode 小于 128,直接取它作为最大响应时间。如果 MaxRespCode 大于等于 128,需要计算 mant | 0x10 << (exp + 3) 的值,其中 mant 是 MaxRespCode 的低 4 位,exp 是其高 5~7 位。
  3. 计算每条报文的实际响应时间:对于每条报文,计算它的最大响应时间,并结合 HOST 收到该报文的时间,计算出此报文的响应时间。
  4. 比较响应时间:对于多条报文的响应时间,选择最小的时间作为 HOST 的最终响应时间。
  5. 输出结果:输出最小的响应时间。

5、算法的时间复杂度

该算法的时间复杂度是 O©,其中 C 是查询报文的个数。因为我们需要遍历所有的报文,每条报文只需常数时间(O(1))计算其最大响应时间和更新最小响应时间。

6、算法的空间复杂度

由于使用的主要数据结构是基本数据类型,没有使用复杂的数据结构,且存储量与报文个数无关,因此空间复杂度为 O(1)。

六、Java算法源码

public class OdTest01 {
    public static void main(String[] args) {
        // 创建 Scanner 对象读取输入
        Scanner scanner = new Scanner(System.in);

        // 读取查询报文个数 C
        int C = scanner.nextInt();

        // 初始化最小响应时间为一个大数
        int minResponseTime = Integer.MAX_VALUE;

        // 处理每一个报文
        for (int i = 0; i < C; i++) {
            // 读取 HOST 收到报文的时间 T 和最大响应时间字段 M
            int T = scanner.nextInt();
            int M = scanner.nextInt();

            // 计算最大响应时间
            int maxResponseTime = calculateMaxResponseTime(M);

            // 计算该报文的最终响应时间 = 收到时间 T + 最大响应时间
            int responseTime = T + maxResponseTime;

            // 更新最小响应时间
            minResponseTime = Math.min(minResponseTime, responseTime);
        }

        // 输出最小的响应时间
        System.out.println(minResponseTime);

        // 关闭 scanner
        scanner.close();
    }

    /**
     * 计算 Max Response Time
     * @param maxRespCode 最大响应时间字段 M
     * @return 计算后的最大响应时间
     */
    public static int calculateMaxResponseTime(int maxRespCode) {
        if (maxRespCode < 128) {
            // 如果 MaxRespCode 小于 128,直接返回 MaxRespCode
            return maxRespCode;
        } else {
            // 如果 MaxRespCode ≥ 128,计算公式:(mant | 0x10) << (exp + 3)
            int mant = maxRespCode & 0x0F; // 取低4位
            int exp = (maxRespCode >> 4) & 0x07; // 取高5~7位
            return (mant | 0x10) << (exp + 3); // 根据公式计算
        }
    }
}

七、效果展示

1、输入

3
10 5
5 20
20 15

2、输出

15

3、说明

  • 第10秒收到第1个报文,最大响应时间为5秒,响应时间为10 + 5 = 15秒;
  • 第5秒收到第2个报文,最大响应时间为20秒,响应时间为5 + 20 = 25秒。与之前的15秒相比,选择较小的15秒;
  • 第20秒收到第3个报文,最大响应时间为15秒,响应时间为20 + 15 = 35秒。与之前的15秒相比,选择较小的15秒;
  • 最终的最小响应时间为15秒。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

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

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

基于SpringBoot的准妈妈孕期交流平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat 系统展示 首页 管理员登录 用户管理 早教…

C++ STL关联容器Set与集合论入门

1. 简介 Set&#xff08;集合&#xff09;属于关联式容器&#xff0c;也是STL中最实用的容器&#xff0c;关联式容器依据特定的排序准则&#xff0c;自动为其元素排序。Set集合的底层使用一颗红黑树&#xff0c;其属于一种非线性的数据结构&#xff0c;每一次插入数据都会自动…

【F的领地】项目拆解:小学教辅资料

项目介绍 虚拟资料项目的赛道其实一直可以做&#xff0c;实际上就是一个信息差项目。 知识付费是常青树&#xff0c;人天生有为知识付费的倾向。 而且虚拟资料通常一份 19~99 的资料有这方面需求很容易就能付款。 主要是产附属的流量再提问题。 我有个同乡&#xff0c;18年…

DDOS攻击学习-scapy使用python编写SYN拒绝服务攻击

文章目录 启动&配置发送数据怎么查看回答查看详细的数据sinff()hexdump() 使用python进行SYN拒绝服务攻击 安装npcap可以查看此教程 启动&配置 scapy#控制台输入如图所示可以查看IP等, 格式是 变量名 IP()/TCP()你可以查看相关信息 变量名.show()以上的值都可以进行…

2024第三届大学生算法大赛 真题训练2 解题报告 | 珂学家 | FFT/NTT板子

前言 题解 D是FFT板子题&#xff0c;这么来看&#xff0c;其实处于ACM入门题&#xff0c;哭了T_T. D. 行走之谜 思路: FFT 如果你知道多项式乘法&#xff0c;继而知道FFT&#xff0c;那题纯粹就是板子题&#xff0c;可惜当时比赛的时候&#xff0c;无人AC。 这题来简单抽象…

最好磁吸充电宝是哪个牌子?目前公认好用磁吸充电宝排行榜!

在现代生活中&#xff0c;移动设备的普及使得充电宝成为了人们日常出行必备的工具。尤其是磁吸充电宝&#xff0c;以其便捷的使用体验和高效的充电速度&#xff0c;逐渐受到消费者的青睐。然而&#xff0c;在选择充电宝时&#xff0c;安全性能是不可忽视的重要因素。一个好的充…

Redis入门1

Redis简介 Redis是一个基于内存的 key-value 结构数据库。 基于内存存储&#xff0c;读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 官网:https://redis.io 中文网:https://www.redis.net.cn/ window版启动命令 redis-server.exe redis.windows.con…

使用dnSpy调试服务端IIS部署的WebService的程序集

服务器上部署的C#编写WebService出现问题&#xff0c;需要排查&#xff0c;但没有对应的源码&#xff0c;只能在服务器端想办法调试。   IIS中部署的WebService服务&#xff0c;其应用程序池对应操作系统中的w3p.exe进程&#xff08;高版本IIS对应的进程是w3wp&#xff09;。…

[001-02-001]. 第07-03节:理解线程的安全问题

我的后端学习大纲 我的Java学习大纲 当多个线程共享一份数据的时候&#xff0c;不同的线程对数据进行操作&#xff0c;就可能会导致线程安全问题&#xff0c;比如卖票过程中出现了错票和重复票的问题&#xff1a; 1、卖票问题分析&#xff1a; 1.1.理想状态&#xff1a; 1.2.极…

软考架构-面向服务的架构风格

一、SOA 1、概念 面向服务开发&#xff0c;服务之间通过简单、精确定义接口进行通信&#xff0c;不涉及底层编程接口和通信模型。多个服务挂载在ESB&#xff08;企业服务总线&#xff09;上进行通信。 2、特征 可从企业外部访问、随时可用&#xff08;服务请求能被及时响应…

这款神器,运维绝杀 !!! 【送源码】

项目简介 CrowdSec 是一款开源的、基于社区协作的网络安全防护工具&#xff0c;它通过分析和共享IP信誉数据来对抗恶意行为。该软件不仅支持IPv6&#xff0c;而且相较于传统的Python实现&#xff0c;其采用Go语言编写&#xff0c;运行速度提升了60倍。CrowdSec 利用Grok模式解析…

Datasheet SHT20芯片的数据手册

Datasheet SHT20芯片的数据手册 I2C读取湿度传感器返回的16位数据。SCL SDA 14位有效&#xff0c;我以为是将后二位删除&#xff0c;实际上看完手册才知道是后二位值无用&#xff0c;不是删除&#xff0c;而是清0&#xff0c;实际上还是16为&#xff0c;知识后二位是0还是1&…

Java重修笔记 第五十四天 坦克大战(四)多线程基础

线程 当点击运行按钮运行程序时&#xff0c;就相当于启动了一个进程&#xff0c;虚拟机进入 mian 方法后会开启一个名为 mian 的主线程&#xff0c;main 方法体中创建一个线程对象&#xff0c;调用该线程对象的 start 方法又创建一个子线程&#xff0c;子线程的启动并不会阻塞…

2024/9/11学校教的响应式前端能学到什么?

9.11 1&#xff09;砌砖 确定整体框架&#xff0c;而不是想到一点写一点&#xff0c;类似盖大楼&#xff0c;不是想到哪盖到哪&#xff0c;先砌砖&#xff0c;再装修 砌砖前先划分好砌砖范围(初始化样式) 清除body自带的内外边距 * { margin: 0; padding: 0; }去掉li的小圆点…

H5接入Steam 获取用户数据案例 使用 OpenID 登录绑定公司APP账户 steam公开用户信息获取 steam webapi文档使用

官方文档地址 1.注册 Steam API Key&#xff1a; 你需要一个 Steam Web API Key&#xff0c;可以在 Steam API Key 页面 获取。https://steamcommunity.com/dev/apikey 这里开发做demo用自己steam账户的就好&#xff0c;后续上线要用公司的账户 2.使用 OpenID 登录&#xff…

【c++实现】统计上升四元组

&#x1f308;个人主页&#xff1a;Yui_ &#x1f308;Linux专栏&#xff1a;Linux &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;数据结构专栏&#xff1a;数据结构 &#x1f308;C专栏&#xff1a;C 文章目录 1. 题目描述2. 解释3. DP前缀和枚举 1. 题目描…

3.Kubernetes资源对象之pod

&#x1f482; 个人主页: Java程序鱼 &#x1f4ac; 如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏(一键三连)和订阅专栏 &#x1f464; 微信号&#xff1a;hzy1014211086&#xff0c;想加入技术交流群的小伙伴可以加我好友&#xff0c;群里会分享学习资料、学习方法…

经典蓝桥题目-------欧拉函数的应用

输入样例&#xff1a; 3 4 9 5 10 42 9999999967 输出样例&#xff1a; 6 1 9999999966 分析&#xff1a; 设 gcd(a,m) d,则 d|a,d|m 而 gcd(a,m) gcd(ax,m) 则有 d|x 根据题目有 0<x<m 同样的有 0< x < m (x,m是同时除以d的值) 于是我们发现只要求…

IPD变革之道内涵是什么?何以与人工智能新技术融合

集成产品开发&#xff08;Integrated ProductDevelopment&#xff0c;IPD&#xff09;引入我国20余年&#xff0c;从探索、扎根到管理驱动&#xff0c;逐渐成为国内企业长存发展之共识。回溯IPD的由来和发展&#xff0c;IPD变革之道内涵是什么&#xff1f;何以与人工智能新技术…

DNS查询报文分析

目录 1. 用 tcpdump工具监听抓包 2. 用 host 工具获取域名对应的IP地址 3. 分析DNS以太网查询数据帧 3.1 linux下查询DNS服务器IP地址 3.2 DNS以太网查询数据帧 &#xff08;1&#xff09;数据链路层 &#xff08;2&#xff09;网络层 &#xff08;3&#xff09;传输层…