1、题目详情
题目描述
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发送响应报文的时间。
示例输入
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秒。
示例输入2
2
0 255
200 60
示例输出2
260
第0秒收到第1个报文,响应时间为255秒,则要到(15|0x10)<<(7+3)=31744秒响应;(mant=15,exp=7)
第200秒收到第2个报文,响应时间为60,则要到200+60=260秒响应,与上面的报文的响应时间比较获得响应时间最小为260秒;
最终得到最小响应报文时间为260秒。
java代码
package odTest;
import java.util.Arrays;
import java.util.Scanner;
public class responseTime {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = Integer.parseInt(scanner.nextLine());
int[] maxRespTimes = new int[num];
for(int i=0;i<num;i++) {
int[] inputs=Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
maxRespTimes[i] =inputs[0] + estimate(inputs[1]);
}
Arrays.sort(maxRespTimes);
System.out.println(maxRespTimes[0]);
}
public static int estimate(int num) {
if(num<128) {
return num;
}else {
// 对于大于或等于128的响应代码,分解出指数部分
int exp = (num >> 7) & 0x7F; // 取高7位作为exp
// 分解出尾数部分
int mant = num & 0x7F; // 取低7位作为mant
// 使用指数和尾数计算最大响应时间
// 将尾数部分与0x10进行或操作,以设置隐含的1,并将结果左移(exp + 3)位,以考虑指数部分
return ((mant | 0x10) << (exp + 3));
}
}
}