• HDU 4712 Hamming Distance (随机算法)


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

    所谓的hamming distance就是the Hamming distance is equal to the number of ones in a XOR b. For calculating
    Hamming distance between two strings a and b, they must have equal length. 两个长度相同的码字,其相对应的位可能不同,彼此不同位的个数称海明 距离。

    应该最长也就20为,所以可以先把所有位数组合的结果先打表出来,然后再随机取数进行判断,在不超时的基础上,次数越高,过的概率越高

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    /*srand((int)time(NULL));设定随机数种子
    rand()%100;产生0-99的随机数。高级点的,假如要产生x    ~y之间的数,你可以这样写:rand()%(y-x+1)+x。*/
    /*产生随机数*/
    #include<time.h>
    int num[21][21];
    int RandNum(int a,int b)/*返回a-b之间的随机数,a>=b*/
    {
        return rand()%(b-a+1)+a;
    }
    void pre()//打表写出所有的可能
    {
        int i,j,sum,aa[22],bb[22],k,n;
        for(i=0;i<16;i++)
            for(k=0;k<16;k++)
        {
            sum=0;
            n=i;
            j=3;
            while(n)
            {
                aa[j--]=n%2;
                n/=2;
            }
            while(j>=0)
                aa[j--]=0;
            n=k;
            j=3;
            while(n)
            {
                bb[j--]=n%2;
                n/=2;
            }
            while(j>=0)
                bb[j--]=0;
            for(j=0;j<4;j++)
                if(aa[j]!=bb[j])
                sum++;
            num[i][k]=sum;
        }
        /*for(i=1;i<6;i++)
            printf("%5d%5d==%5d
    ",i,6-i,num[i][6-i]);*/
    }
    int hamming(char *a,char *b)
    {
        int aa,bb;
        int i,j,len,sum=0;
        i=j=0;
        for(i=0;i<5;i++)
        {
            if(a[i]>='0'&&a[i]<='9')
            aa=a[i]-'0';
            else aa=a[i]-'A'+10;
            if(b[i]>='0'&&b[i]<='9')
            bb=b[i]-'0';
            else bb=b[i]-'A'+10;
                sum+=num[aa][bb];
        }
        return sum;
    
    }
    int main()
    {
        int a,b,i,t,n,MIN,x;
        char s[100010][5],c[20];
        pre();
        srand((int)time(NULL));/*先设定随机种子*/
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            gets(c);
            for(i=1;i<=n;i++)
            {
                scanf("%s",s[i]);
                //printf("%s",s[i]);
            }
            MIN=21;
            for(i=0;i<900000;i++)
            {
                a=b=RandNum(1,n);
                while(b==a)
                    b=RandNum(1,n);
                x=hamming(s[a],s[b]);
                if(x<MIN)MIN=x;
            }
            printf("%d
    ",MIN);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Eclipse中一个Web项目引用另一个项目中的类
    android adb shell中使用到的命令
    移动端服务器i-jetty下载编译安装及问题解决系列
    Windows和Ubuntu双系统独立分区安装的方法
    Mina2.0框架源码剖析(三)
    Mina2.0框架源码剖析(二)
    Mina2.0框架源码剖析(一)
    JBoss
    J2EE的体系结构
    微博三方登录
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3311793.html
Copyright © 2020-2023  润新知