D. Bits Reverse
每次将三个连续的位反转,其实中间的位是不变的,就是把第一位和第三位互换,可以发现奇数位和偶数位互不影响,那么分别处理奇数位和偶数位即可。然后分别比较1的位数是否相同,然后再计算移动的步数(这里用了贪心,也可以直接将对应1的位置加起来相减取绝对值)
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int main()
{
ios::sync_with_stdio(false), cin.tie(0);
long long n, m;
int a[100], b[100];
int t, c = 0;
cin >> t;
while (t--)
{
cout << "Case " << ++c << ": ";
vector<int> cnta, cntb;//记录1的位置
int sum = 0;
cin >> n >> m;
//将每一位保存到数组中
for (int i = 0; i < 64; i++)
{
a[i] = n & 1;
b[i] = m & 1;
n >>= 1;
m >>= 1;
}
//处理奇数位
for (int i = 0; i < 64; i++)
{
if (i & 1)
{
if (a[i]) cnta.push_back(i);
if (b[i]) cntb.push_back(i);
}
}
//判断1的位数是否相同,如果不同就输出-1
if (cnta.size() != cntb.size())
{
cout << -1 << endl;
continue;
}
else
{
//累加移动步数,注意要除2
for (int i = 0; i < cnta.size(); i++)
sum += abs(cnta[i] - cntb[i]) / 2;
cnta.clear();
cntb.clear();
}
//处理偶数位
for (int i = 0; i < 64; i++)
{
if (!(i & 1))
{
if (a[i]) cnta.push_back(i);
if (b[i]) cntb.push_b