B:Bit Magic
现在有两个十进制数 xxx 和 yyy ,你可以进行下面两种操作:
1. 将 xxx 变成 x+1x + 1x+1 ,花费为 111 。
2. 将 xxx 变成 x⊕2^i(0≤i≤30),花费为 2^i 。其中 ⊕ 表示位运算中的异或操作,例如,0101(十进制表示为 5) ⊕ 0011(十进制表示为 3) === 0110(十进制表示为 6)。
请问 x 变成 y 的最小花费是多少?多组数据
将状态转化成小数变成大数形式,即为y - x的时候,最小花费就是y - x,
思路:寻找大数中比小数更小的部分(1000与0011的后面两位)记录前面的biggerPart剩余部分用小数转化为大数完成。
技巧:取x的第i位数字 x >> i & 1
#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
int T, x, y, res;
void solve()
{
scanf("%d%d", &x, &y);
int biggerPart = 0;
for (int i = 30; i >= 0; i -- )
{
//取低位
int a = x >> i & 1;
int b = y >> i & 1;
if (a && !b) //a为1 但是b为0
biggerPart += 1 << i;
else if (a != b) //a为0 b=1的情况
break;
}
x -= biggerPart; //将x转化成比y小的数
res = (y - x) + biggerPart;
printf("%d\n", res);
}
int main()
{
scanf("%d", &T);
while ( T -- )
solve();
return 0;
}