【2025华为OD机考真题】- 响应报文时间(B卷-200分)(C版)

本文收录于「最新最全华为OD机试真题(C版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅题库正在疯狂收录中,up!up!up!!
提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。
  
订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!

所有题目均有六种语言实现,汇总如下

  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【6种语言合集版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【Java版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【Python版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【C版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【C++版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【Golang版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【JavaScript版】

如上题库均已同步更新至最新华为OD机试真题,赶紧操练起来吧~~

1. 题目描述

具体题目描述如下:

IGMP 协议中,有一个字段称作最大响应时间(MaxResponseTime),HOST收到查询报文,解析出 MaxResponseTime 字段后,需要在 (0,MaxResponseTime](s)时间内选取随机时间回应一个响应报文,如果在随机时间内收到一个新的查询报文,则会根据两者时间的大小,选取小的一方剧新回应时间。
最大响应时间有如下计算方式:
MaxRespcode < 128MaxRespTime = MaxRespcode
MaxRespcode >= 128MaxRespTime = ( mant | ex10 ) << ( exp + 3 )
| 0 | 123 | 4567 |
| 1 | exp | mant |

注:exp 最大响应时间的高 5~7 位;mant 为最大响应时间的低4 位。
其中接收到的 maxRespcode 最大值为 255,以上出现所有字段均为无符号数。
现在我们认为 HOST 接收到查询报文时,选取的随机时间必定为最大值。
现给出 HOST 收到查询报文个数 C ,HOST 收到报文的时间 $T$,以及查询报文的最大响应时间字段值 M ,请计算出 HOST 发送响
应报文的时间。

2. 输入描述

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

️3. 输出描述

HOST 发送响应报文的时间。

补充说明:

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

4. 示例演示

✨4.1 示例1

输入:

3
0 20
1 10
8 20

输出:

11

示例说明:

收到3个报文:

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

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

✨4.2 示例2

输入:

2
0 255
200 60

输出:

260

示例说明:

收到2个报文:

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

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

✨4.3 示例3

输入:


输出:


示例说明:

温馨提醒: 大家在参加华为OD机试时,切记不要仅仅死记硬背题解代码。真正的通过率取决于你对代码的理解能力。建议你在理解基本原理和逻辑的基础上,模仿并自己编写代码,这样才能更有效地应对机试。

5. 解题分析

5.1 问题理解

题目给定了一个图中的查询报文,每个报文有一个最大响应时间 M 和收到时间 T。每个报文的响应时间可以根据 M 计算得到。如果 M 小于128,则响应时间直接为 M,如果 M 大于等于128,则根据指定的公式进行计算。

要求我们计算 HOST 在收到一系列查询报文后,发送响应报文的最短时间。我们要考虑每个报文的最大响应时间,并且在新的报文到达时,选取时间最小的响应时间作为最终的发送响应时间。

5.2 解题思路

  1. 解析最大响应时间:

    • 对于 M < 128,响应时间等于 M
    • 对于 M >= 128,响应时间的计算公式为 (mant | 0x10) << (exp + 3),其中 mantexp 分别是 M 的低 4 位和高 4 到 6 位的值。
  2. 更新响应时间:

    • 每当收到一个查询报文时,我们计算它的响应时间 T + MaxRespTime
    • 如果这是我们遇到的最小响应时间,则更新最小响应时间。
  3. 输出最小响应时间:

    • 最终返回所有报文中的最小响应时间。

5.3 问题考点

  1. 最大响应时间的计算:
    需要正确解析 M 来计算最大响应时间,根据 M 的大小使用不同的公式。

  2. 时间更新:
    每次收到新的查询报文时,要根据已收到的时间和最大响应时间来更新最小响应时间。

  3. 循环和条件判断:
    需要通过循环处理多个查询,并在每次迭代中进行比较和更新。

5.4 解题步骤

  1. 读取输入:
    读取报文的数量以及每个报文的 TM

  2. 计算每个报文的响应时间:
    根据 M 计算最大响应时间,并与当前的最小响应时间进行比较。

  3. 输出最小响应时间:
    输出最终计算出的最小响应时间。

6. 解题Coding

  根据如上题解思路,进行代码实战,大家请看如下,建议不要死记硬背代码,要理解其题型及实现思路,别担心,代码我都会给出超详细注释,你一定能看明白的。

✅6.1 代码实现(C语言版)

#include 
#include 

// 计算最大响应时间
int calculateMaxRespTime(int MaxRespCode) {
    int MaxRespTime;
    if (MaxRespCode < 128) {
        MaxRespTime = MaxRespCode;
    } else {
        // 提取 exp 和 mant
        int exp = (MaxRespCode & 112) >> 4;  // 提取 exp
        int mant = MaxRespCode & 15;  // 提取 mant
        // 计算最大响应时间
        MaxRespTime = (mant | 0x10) << (exp + 3);
    }
    return MaxRespTime;
}

int main() {
    int n;
    // 读取查询的总次数
    scanf("%d", &n);

    // 初始化最小响应时间为最大值
    int ans = INT_MAX;

    // 处理每个查询
    for (int i = 0; i < n; i++) {
        int T, MaxRespCode;
        // 读取开始时间 T 和 最大响应时间码 MaxRespCode
        scanf("%d %d", &T, &MaxRespCode);

        // 计算最大响应时间
        int MaxRespTime = calculateMaxRespTime(MaxRespCode);

        // 更新最小响应时间
        ans = (ans < (T + MaxRespTime)) ? ans : (T + MaxRespTime);
    }

    // 输出最小响应时间
    printf("%d\n", ans);

    return 0;
}

⏱6.2 时间&空间复杂度

时间复杂度:
  • 读取输入和计算:对于每个查询,我们都需要读取两个整数并进行一次常数时间的计算(最大响应时间)。因此,时间复杂度为 O(n),其中 n 是查询次数。
  • 总时间复杂度O(n),即线性复杂度。
空间复杂度:
  • 输入存储:我们只需要存储一个最小响应时间和常数的额外变量。因此,空间复杂度为 O(1)

⛓‍6.3 代码解析

  1. 计算最大响应时间

    • 对于每个查询,通过 calculateMaxRespTime 函数计算最大响应时间:
      • 如果 MaxRespCode 小于 128,则响应时间直接等于 MaxRespCode
      • 如果 MaxRespCode 大于等于 128,提取 expmant,计算最大响应时间。这里的计算过程基于位运算:
        • exp 提取了 MaxRespCode 中的 4 位(第 5 到第 8 位)。
        • mant 提取了 MaxRespCode 中的低 4 位。
        • 计算 MaxRespTime 后,通过左移运算得到最终结果。
  2. 处理查询

    • 对于每个查询,读取开始时间 T 和最大响应时间码 MaxRespCode,计算出响应时间 MaxRespTime,然后更新最小响应时间 ans
  3. 输出最小响应时间

    • 在循环结束后,输出最小响应时间 ans

6.4 小结

这段 C 语言代码模拟了 Java 中的逻辑,通过计算每个查询的响应时间并更新最小响应时间。采用位运算处理 MaxRespCode,计算最大响应时间,并通过简单的比较更新最小响应时间。代码的时间复杂度为 O(n),空间复杂度为 O(1),适用于处理中小规模的查询数据。

7. 附录源码(Java版)

  针对如上分享OD机试真题之外,这里我还开源全部OD机试原真题源码,供同学们一对一学习!对照每题都有题目号及详细代码注释。Gitee,例如题序号为1,则题解代码对应文件夹OD1,题序号为5,则题解代码对应文件夹OD5,以此类推,目的就是为了方便大家学习,一举上岸!(这里的题序号指专栏导航贴中表格一列的序号)

福利赠与你

  如果你还想学习更多相关OD真题题解,都建议直接毫不犹豫地学习此专栏「最新最全真题华为OD机试真题(全栈版)」,快速掌握Java、Python、C++、JavaScript、Go等多种热门语言详细解题,快速突破华为OD机试,实现350+高分目标。还将提供线上多端答疑交流,解决你的所有问题!

安利其他语言版本题解册

  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【6种语言合集版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【Java版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【Python版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【C版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【C++版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【Golang版】
  • 【华为OD机试】最新最全真题汇总A+B+C+D+E卷【JavaScript版】

注意: 上述任意专栏一次订阅,获永久免费阅读权限,后续更新都能学习。
声明: 拒绝一切形式的代考,替考行为,务必诚信考试!!!本人所写题库均搜集于互联网。

‍Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

你可能感兴趣的:(华为od,c语言,华为,华为OD,华为OD机考真题,算法,响应报文时间)