题目的意思是取两个数的异或之后1的个数最小的情况,刚刚开始我以为最小值的时候就是,但是显然不对。所以现在问题归结为对一个数二进制1的个数的统计,可以用统计最右边的1然后将数右移动的方法,具体看代码。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int T;
cin>>T;
int a[200];
int b[200];
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n,cmp);
int cont=0;
for(int j=0;j<m;j++)
{
int t;
cin>>t;
int min1=100000000;
for(int i=0;i<n;i++)
{
int ans1;
ans1 = t^a[i];
int num=0;
while(ans1!=0)
{
if((ans1&1)==1)
{
num++;
}
ans1>>=1;
}
if(num<=min1)
{
b[cont]=a[i];
min1=num;
}
}
cont++;
}
for(int i=0;i<cont;i++)
{
printf("%d\n",b[i]);
}
}
}