注:将数字转换为二进制比较就可,主要是细节问题
For 2 non-negative integers x and y, f(x, y) is defined as the number of different bits in the binary format of x and y. For example, f(2, 3)=1, f(0, 3)=2, f(5, 10)=4.
Now given 2 sets of non-negative integers A and B, for each integer b in B, you should find an integer a in A such that f(a, b) is minimized. If there are more than one such integers in set A, choose the smallest one.
题意:f(x,y)表示将x,y转化为二进制后对应位数字不相同的个数,现在有A,B两个集合,对于集合B里的每个元素b,要从A集合中挑选出一个a使得f(a,b)最小,如果有多个,则输出最小的那个a。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define N 110
#define INF 0x3f3f3f3f
int a[25],b[25],A[N],B[N];
int getBinary(int x,int *a){
int t=0;
if(x==0) a[t++]=x;
while(x){
a[t++]=x%2;
x/=2;
}
return t;
}
int f(int *a,int la,int *b,int lb){
int t=0;
for(int i=0,j=0;i<la||j<lb;i++,j++){
if(i>=la) a[i]=0;
else if(j>=lb) b[j]=0;
if(a[i]!=b[j]) t++;
}
return t;
}
int main(){
int m,n,T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
scanf("%d",&A[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&B[i]);
}
for(int i=0;i<n;i++){
int Min=INF,ans=INF;
for(int j=0;j<m;j++){
int la = getBinary(B[i],a);
int lb = getBinary(A[j],b);
int tmp = f(a,la,b,lb);
if(tmp<Min){
Min = tmp;
ans=A[j];
}else if(tmp==Min){
if(ans>A[j]) ans=A[j];
}
}
printf("%d\n",ans);
}
}
return 0;
}