大意:给定两个数组A,B,让你求在二进制表示下,B中数变为A中数所需要的最小操作。
思路:对每一个B中的数,枚举A中所有数,保存最小值即可,注意题目要求选A中最小的那个数,所以开始需要排序。位运算求操作数比较高效。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn = 101;
const int INF = 0x3f3f3f3f;
int n, m;
int a[maxn];
int cal(int a, int b)
{
int M = a ^ b;
int num = 0;
while(M)
{
M &= (M-1);
num++;
}
return num;
}
int get_ans(int t)
{
int min = INF, num = 0, ans;
for(int i = 0; i < n; i++)
{
num = cal(a[i], t);
if(num < min) { min = num; ans = a[i]; }
}
return ans;
}
void read_case()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, a+n);
}
void solve()
{
read_case();
int t;
while(m--)
{
scanf("%d", &t);
int ans = get_ans(t);
printf("%d\n", ans);
}
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
solve();
}
return 0;
}