HDU 3711 Binary Number

题目链接:

http://acm.split.hdu.edu.cn/showproblem.php?pid=3711

Problem Description
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 integer in set A, choose the smallest one.
 

 

Input
The first line of the input is an integer T (0 < T ≤ 100), indicating the number of test cases. The first line of each test case contains 2 positive integers m and n (0 < m, n ≤ 100), indicating the numbers of integers of the 2 sets A and B, respectively. Then follow (m + n) lines, each of which contains a non-negative integers no larger than 1000000. The first m lines are the integers in set A and the other n lines are the integers in set B.
 

 

Output
For each test case you should output n lines, each of which contains the result for each query in a single line.
 

 

Sample Input
2
2 5
1
2
1
2
3
4
5
5 2
1000000
9999
1423
3421
0
13245
353
 

 

Sample Output
1
2
1
1
1
9999
0

 

Hint:

题意:

f(a,b)是非负整数a和b二进制时不同的位数
给两个集合A,B,A和B的大小不超过100
对于B中每个数b,求A中f(a,b)最小的数。

题解:

直接暴力计算。

代码:

1.计算两个数二进制之间不同的模版:

int change(int a,int b)
{
    int x=a^b;
    int num=0;
    while(x)
    {
        x&=(x-1);
        num++;
    }
    return num;

 2.完整代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100+10;
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof(a))
int a[maxn],b[maxn];
int change(int a,int b)
{
    int x=a^b;
    int num=0;
    while(x)
    {
        x&=(x-1);
        num++;
    }
    return num;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&b[i]);
        sort(a,a+n);
        for(int i=0;i<m;i++)
        {
            int num,ans=inf;
            for(int j=0;j<n;j++)
            {
                int num1=change(b[i],a[j]);
                if(num1<ans)
                {
                    ans=num1;
                    num=a[j];
                }
            }
            printf("%d\n",num);
        }
    }
}

 

posted @ 2016-09-09 15:07  _Silver  阅读(170)  评论(0编辑  收藏  举报