来源:2010 Asia Chengdu Regional Contest
思路:简单题,计算最小不同位的个数。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 110;
const int INF = 1000001;
int a[MAX], b[MAX];
int n, m;
int cmp(int c, int d) {
return c < d;
}
int solve(int v) {
int mi = INF, ans=0;
int i, tb, ta, cnt;
for (i = 0; i < m; ++i) {
ta = a[i];
tb = v;
cnt = 0;
while (ta || tb) {
if (ta%2 != tb %2)
cnt++;
if (ta)
ta >>= 1;
if (tb)
tb >>= 1;
}
if (cnt < mi) {
mi = cnt;
ans = a[i];
}
}
return ans;
}
int main()
{
int i, t;
scanf("%d", &t);
while (t--) {
scanf("%d %d", &m, &n);
for (i = 0; i < m; ++i)
scanf("%d", &a[i]);
sort(a, a+m, cmp);
for (i = 0; i < n; ++i) {
scanf("%d", &b[i]);
printf("%d\n", solve(b[i]));
}
}
return 0;
}