zoukankan      html  css  js  c++  java
  • 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
    ",num);
            }
        }
    }
    
  • 相关阅读:
    移动 Web 开发技巧
    判断手机是苹果还是安卓,并且判断安卓的高低版本
    JavaScript判断移动端及pc端访问不同的网站
    input实时监控和获取焦点的问题,oninput,ononfocus
    几个CSS3动画
    canvas加载进度条
    animation动画兼容所有手机
    背景渐变,兼容所有手机端
    文字动画和文字镂空
    前端面试题
  • 原文地址:https://www.cnblogs.com/TAT1122/p/5856699.html
Copyright © 2011-2022 走看看