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);
            }
        }
    }
    
  • 相关阅读:
    SQL函数介绍,SDE函数
    [API]Google的语音识别API,支持各种语言
    (C#)Windows Shell 外壳编程系列8 同后缀名不同图标?
    (C#)Windows Shell 外壳编程系列8 同后缀名不同图标?
    获取某路径下,最后被修改的文件
    centos7下关闭防火墙
    linux下常用命令
    unittest断言
    **目录找出最后一次修改的文件(html结果),发送报告到指定qq邮箱
    unittest,requests,assertEqual实战演练
  • 原文地址:https://www.cnblogs.com/TAT1122/p/5856699.html
Copyright © 2011-2022 走看看