最新华为OD机试
题目描述
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
输入
3
0 20
1 10
8 20
1234
输出
11
1
说明
收到3个报文,
第0秒收到第1个报文,响应时间为20秒,则要到0+20=20秒响应;
第1秒收到第2个报文,响应时间为10秒,则要到1+10=11秒响应,与上面的报文的响应时间比较获得响应时间最小为11秒;第8秒收到第3个报文,响应时间为20秒,则要到8+20=28秒响应,与第上面的报文的响应时间比较获得响应时间最小为11秒;
最终得到最小响应报文时间为11秒
示例2
输入
2
0 255
200 60
123
输出
260
1
说明
收到2个报文,
第0秒收到第1个报文,响应时间为255秒,则要到(15 | 0x10) << (7 + 3)= 31744秒响应; (mant = 15,exp =7)第200秒收到第2个报文,响应时间为60秒,则要到200+60-260秒响应,与第上面的报文的响应时间比较获得响应时间最小为260秒:
最终得到最小响应报文时间为260秒
解题思路
这道题目要求计算在IGMP协议下,HOST在收到多个查询报文后,确定的最早发送响应报文的时间点。HOST需要根据每个报文的最大响应时间字段MaxRespCode
来计算其最大响应时间,并在计算出所有可能的响应时间后选取最早的那个时间点。
核心是:
-
当
m < 128
时,m
直接作为MaxResponseTime
。 -
当
m >= 128
时,需要将m
转换为8位二进制字符串,将第1至第3位提取为exp
,第4至第7位提取为mant
。接着,将exp
和mant
转换为十进制值,并代入公式(mant | 0x10) << (exp + 3)
进行计算,即可得到MaxResponseTime
。
示例解释
-
示例1:
- 报文1: 在
0
秒收到,M=20
,最大响应时间是20
秒,因此最迟在0 + 20 = 20
秒响应。 - 报文2: 在
1
秒收到,M=10
,最大响应时间是10
秒,因此最迟在1 + 10 = 11
秒响应。 - 报文3: 在
8
秒收到,M=20
,最大响应时间是20
秒,因此最迟在8 + 20 = 28
秒响应。 - 最早的响应时间是
11
秒。
- 报文1: 在
-
示例2:
- 报文1: 在
0
秒收到,M=255
,因为M >= 128
,需要计算(mant | 0x10) << (exp + 3)
:mant = 15
,exp = 7
。计算得MaxRespTime = (15 | 0x10) << (7 + 3) = 31744
秒。
- 报文2: 在
200
秒收到,M=60
,最大响应时间是60
秒,因此最迟在200 + 60 = 260
秒响应。 - 最早的响应时间是
260
秒。
- 报文1: 在
Java
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int numQueries = in.nextInt(); // 查询报文个数
int[] arrivalTime = new int[numQueries]; // HOST收到报文时间
int[] maxRespCode = new int[numQueries]; // 最大响应时间字段值
for (int i = 0; i < numQueries; i++) {
arrivalTime[i] = in.nextInt();
maxRespCode[i] = in.nextInt();
}
int minResponseTime = Integer.MAX_VALUE; // HOST发送响应报文的时间
for (int i = 0; i < numQueries; i++) {
int maxRespTime = 0;</