百度笔试真题-最小对冲值(C++/Py/Java /Js/Go) 最小对冲值百度技术岗 笔试真题 8月6号 第二题题目内容调度模块要把一个非负整型额度mmm拆成两份任选整型yyy0≤y≤m0 \le y \le m0≤y≤m另一份为m−ym-ym−y。定义这次拆分的「对冲值」为G(y)y⊕(m−y)G(y)y \oplus (m-y)G(y)y⊕(m−y)其中⊕\oplus⊕为按位异或对应二进制位相同得000、不同得111。例如6 (1102)6\ (110_2)6(1102​)与1 (0012)1\ (001_2)1(0012​)满足6 xor 17 (1112)6\ \text{xor}\ 1 7\ (111_2)6xor17(1112​)。现给定若干个额度请对每个mmm求出可取到的最小对冲值。输入描述第一行一个整型nnn(1≤n≤105)(1 \le n \le 10^5)(1≤n≤105)表示随后有nnn行额度。接下来nnn行每行一个整型mmm(1≤m≤1018)(1 \le m \le 10^{18})(1≤m≤1018)。请对每个mmm逐一计算其最小对冲值。输出描述共输出nnn行对于每一个mmm写出一个非负整型即min⁡(0⊕m, 1⊕(m−1), 2⊕(m−2), …, m⊕0)\min\bigl(0\oplus m,\ 1\oplus(m-1),\ 2\oplus(m-2),\ \ldots,\ m\oplus 0\bigr)min(0⊕m,1⊕(m−1),2⊕(m−2),…,m⊕0)样例1输入3 4 5 11输出0 1 3说明三个额度依次为4,5,114,5,114,5,11取y2y2y2时2⊕202\oplus 202⊕20取y2y2y2时2⊕312\oplus 312⊕31取y4y4y4时4⊕734\oplus 734⊕73。样例2输入2 2 7输出0 7说明额度222取y1y1y1得1⊕101\oplus 101⊕10。额度777枚举可知最小对冲值为777。题解思路数学原理二进制加法公式a b (a ^ b) 2 * (a b)a ^ b a b - 2 * (a b)对应到此题中y ^ (m - y) m - 2 * (y (m - y))最小值就是让y (m - y)尽可能大。就是让两个数接近。所以选择两个数分别为m /2和(m 1) /2C#includebits/stdc.husingnamespacestd;intmain(){ios_base::sync_with_stdio(false);cin.tie(nullptr);intT;cinT;while(T--){intm;cinm;cout((m/2)^((m1)/2))endl;}return0;}javaimportjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);intTsc.nextInt();while(T--0){intmsc.nextInt();System.out.println((m/2)^((m1)/2));}sc.close();}}pythonimportsys# 读取输入datasys.stdin.read().split()Tint(data[0])idx1whileT0:mint(data[idx])idx1print((m//2)^((m1)//2))T-1javascriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});letinput[];rl.on(line,function(line){input.push(...line.trim().split(/\s/));});rl.on(close,function(){letidx0;letTNumber(input[idx]);console.log(T);while(T0){T--;letmNumber(input[idx]);console.log((Math.floor(m/2))^(Math.floor((m1)/2)));}});Gopackagemainimport(bufiofmtos)funcmain(){in:bufio.NewReader(os.Stdin)varTintfmt.Fscan(in,T)out:bufio.NewWriter(os.Stdout)deferout.Flush()forT0{varmintfmt.Fscan(in,m)fmt.Fprintln(out,(m/2)^((m1)/2))T--}}