本文收录于「最新最全华为OD机试真题(C版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!!
提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。
订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅读使用!
如上题库均已同步更新至最新华为OD机试真题,赶紧操练起来吧~~
具体题目描述如下:
IGMP
协议中,有一个字段称作最大响应时间(MaxResponseTime
),HOST收到查询报文,解析出 MaxResponseTime
字段后,需要在 (0,MaxResponseTime
](s)时间内选取随机时间回应一个响应报文,如果在随机时间内收到一个新的查询报文,则会根据两者时间的大小,选取小的一方剧新回应时间。
最大响应时间有如下计算方式:
当 MaxRespcode < 128
,MaxRespTime = MaxRespcode
;
当 MaxRespcode >= 128
,MaxRespTime = ( mant | ex10 ) << ( exp + 3 )
;
| 0 | 123 | 4567 |
| 1 | exp | mant |
注:exp 最大响应时间的高 5~7 位;mant 为最大响应时间的低4 位。
其中接收到的 maxRespcode
最大值为 255,以上出现所有字段均为无符号数。
现在我们认为 HOST 接收到查询报文时,选取的随机时间必定为最大值。
现给出 HOST 收到查询报文个数 C
,HOST 收到报文的时间 $T$
,以及查询报文的最大响应时间字段值 M
,请计算出 HOST 发送响
应报文的时间。
第一行为查询报文个数C,后续每行分别为 HOST 收到报文时间T,及最大响应字段 M,以空格分割。
HOST 发送响应报文的时间。
补充说明:
用例确定只会发送一个响应报文,不存在计时结束后依然收到查询报文的情况。
输入:
3
0 20
1 10
8 20
输出:
11
示例说明:
收到3个报文:
最终得到最小响应报文时间为 11 秒。
输入:
2
0 255
200 60
输出:
260
示例说明:
收到2个报文:
15 | 0x10) << (7+3) = 31744
秒响应;( mant = 15
,exp = 7
)200+60=260
秒响应,与第上面的报文的响应时间比较获得响应时间最小为 260
秒:最终得到最小响应报文时间为 260 秒
输入:
输出:
示例说明:
温馨提醒: 大家在参加华为OD机试时,切记不要仅仅死记硬背题解代码。真正的通过率取决于你对代码的理解能力。建议你在理解基本原理和逻辑的基础上,模仿并自己编写代码,这样才能更有效地应对机试。
题目给定了一个图中的查询报文,每个报文有一个最大响应时间 M
和收到时间 T
。每个报文的响应时间可以根据 M
计算得到。如果 M
小于128,则响应时间直接为 M
,如果 M
大于等于128,则根据指定的公式进行计算。
要求我们计算 HOST 在收到一系列查询报文后,发送响应报文的最短时间。我们要考虑每个报文的最大响应时间,并且在新的报文到达时,选取时间最小的响应时间作为最终的发送响应时间。
解析最大响应时间:
M < 128
,响应时间等于 M
。M >= 128
,响应时间的计算公式为 (mant | 0x10) << (exp + 3)
,其中 mant
和 exp
分别是 M
的低 4 位和高 4 到 6 位的值。更新响应时间:
T + MaxRespTime
。输出最小响应时间:
最大响应时间的计算:
需要正确解析 M
来计算最大响应时间,根据 M
的大小使用不同的公式。
时间更新:
每次收到新的查询报文时,要根据已收到的时间和最大响应时间来更新最小响应时间。
循环和条件判断:
需要通过循环处理多个查询,并在每次迭代中进行比较和更新。
读取输入:
读取报文的数量以及每个报文的 T
和 M
。
计算每个报文的响应时间:
根据 M
计算最大响应时间,并与当前的最小响应时间进行比较。
输出最小响应时间:
输出最终计算出的最小响应时间。
根据如上题解思路,进行代码实战,大家请看如下,建议不要死记硬背代码,要理解其题型及实现思路,别担心,代码我都会给出超详细注释,你一定能看明白的。
#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;
}
O(n)
,其中 n
是查询次数。O(n)
,即线性复杂度。O(1)
。计算最大响应时间:
calculateMaxRespTime
函数计算最大响应时间:
MaxRespCode
小于 128,则响应时间直接等于 MaxRespCode
。MaxRespCode
大于等于 128,提取 exp
和 mant
,计算最大响应时间。这里的计算过程基于位运算:
exp
提取了 MaxRespCode
中的 4 位(第 5 到第 8 位)。mant
提取了 MaxRespCode
中的低 4 位。MaxRespTime
后,通过左移运算得到最终结果。处理查询:
T
和最大响应时间码 MaxRespCode
,计算出响应时间 MaxRespTime
,然后更新最小响应时间 ans
。输出最小响应时间:
ans
。这段 C 语言代码模拟了 Java 中的逻辑,通过计算每个查询的响应时间并更新最小响应时间。采用位运算处理 MaxRespCode
,计算最大响应时间,并通过简单的比较更新最小响应时间。代码的时间复杂度为 O(n)
,空间复杂度为 O(1)
,适用于处理中小规模的查询数据。
针对如上分享OD机试真题之外,这里我还开源全部OD机试原真题源码,供同学们一对一学习!对照每题都有题目号及详细代码注释。Gitee,例如题序号为1,则题解代码对应文件夹OD1,题序号为5,则题解代码对应文件夹OD5,以此类推,目的就是为了方便大家学习,一举上岸!(这里的题序号指专栏导航贴中表格一列的序号)
如果你还想学习更多相关OD真题题解,都建议直接毫不犹豫地学习此专栏「最新最全真题华为OD机试真题(全栈版)」,快速掌握Java、Python、C++、JavaScript、Go等多种热门语言详细解题,快速突破华为OD机试,实现350+高分目标。还将提供线上多端答疑交流,解决你的所有问题!
注意: 上述任意专栏一次订阅,获永久免费阅读权限,后续更新都能学习。
声明: 拒绝一切形式的代考,替考行为,务必诚信考试!!!本人所写题库均搜集于互联网。
我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主&最具价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。
-End-