#P3084. 响应报文时间(100分)
-
1000ms
Tried: 154
Accepted: 43
Difficulty: 3
所属公司 :
华为od
响应报文时间(100分)
二进制运算
考察二进制运算及其相关操作,给定多组数字,对于每组数字t,w,要求我们处理其值并取最小值输出。我们可以分为两种情况来讨论: 1.当数字w小于128时:直接输出该数字和附加值的和即可。 2.当数字w大于等于128时:需要对其进行二进制处理,获取特定的二进制段 exp 和 mant,并根据公式(w = (mant | 0x10) << (exp + 3))计算出一个值取全部分组的最小值.
代码如下
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 100005
int b[10];
void bit(int x){
for(int i=7;i>=0;i--){
b[i]=x&1;
x>>=1;
}
}
int exp(){
int res=0;
int now=1;
for(int i=3;i>=1;i--){
if(b[i]) res+=now;
now*=2;
}
return res;
}
int mant(){
int res=0;
int now=1;
for(int i=7;i>=4;i--){
if(b[i]) res+=now;
now*=2;
}
return res;
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
int ans=100000000;
for(int i=1;i<=n;i++){
int t,w;
cin>>t>>w;
if(w<128){
ans=min(ans,t+w);
}
else{
bit(w);
ans=min(ans,t+((mant()|0x10)<<(exp()+3)));
}
}
cout<<ans<<'\n';
return 0;
}
python
def bit(x):
b = [0] * 8
for i in range(7, -1, -1):
b[i] = x & 1
x >>= 1
return b
def exp(b):
res = 0
now = 1
for i in range(3, 0, -1):
if b[i]:
res += now
now *= 2
return res
def mant(b):
res = 0
now = 1
for i in range(7, 3, -1):
if b[i]:
res += now
now *= 2
return res
n = int(input())
ans = 100000000
for _ in range(n):
t, w = map(int, input().split())
if w < 128:
ans = min(ans, t + w)
else:
b = bit(w)
ans = min(ans, t + ((mant(b) | 0x10) << (exp(b) + 3)))
print(ans)
java
import java.util.*;
public class Main {
static int[] b = new int[8];
static void bit(int x) {
for (int i = 7; i >= 0; i--) {
b[i] = x & 1;
x >>= 1;
}
}
static int exp() {
int res = 0;
int now = 1;
for (int i = 3; i >= 1; i--) {
if (b[i] == 1) res += now;
now *= 2;
}
return res;
}
static int mant() {
int res = 0;
int now = 1;
for (int i = 7; i >= 4; i--) {
if (b[i] == 1) res += now;
now *= 2;
}
return res;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
long ans = 100000000L;
for (int i = 0; i < n; i++) {
int t = sc.nextInt();
int w = sc.nextInt();
if (w < 128) {
ans = Math.min(ans, t + w);
} else {
bit(w);
ans = Math.min(ans, t + ((mant() | 0x10) << (exp() + 3)));
}
}
System.out.println(ans);
}
}
题目内容
IGMP 协议中,有一个字段称作最大响应时间 (MaxResponseTime) ,HOST收到查询报文,解折出 MaxResponsetime 字段后,需要在 [0,MaxResponseTime] 时间 (s) 内选取随机时间回应一个响应报文,如果在随机时间内收到一个新的查询报文,则会根据两者时间的大小,选取小的一方刷新回应时间。
最大响应时间有如下计算方式:
- 当 MaxRespCode<128,MaxRespTime=MaxRespCode;
- 当 MaxRespCode≥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
输出
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
输出
260
说明
收到2个报文,
第0秒收到第1个报文,响应时间为255秒,则要到(15 | 0x10) << (7 + 3)= 31744秒响应; (mant = 15,exp =7)
第200秒收到第2个报文,响应时间为60秒,则要到200+60-260秒响应,与第上面的报文的响应时间比较获得响应时间最小为260秒:
最终得到最小响应报文时间为260秒