HDU 4712 Hamming Distance(随机算法)

本文探讨了HDU 4712问题的解决方案,涉及二进制海明距离计算及使用伪随机数进行模拟。通过随机数生成与比较不同数对的海明距离,最终找出最小的两个海明距离值。代码包含两种实现方式,一种用于计算海明距离,另一种则采用随机数模拟来寻找最小距离。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4712

题目大意:任意两个数按位异或后二进制中含1的个数被称为海明距离,给定n个数,求出任意其中两个最小的海明数,输入是16进制。

Sample Input
2
2
12345
54321
4
12345
6789A
BCDEF
0137F
 
Sample Output
6
7

分析:用随机数来模拟,加srand()函数,放置产生伪随机数。代码有2个。

代码1:

 1 # include<iostream>
 2 # include<cstdio>
 3 # include<cstring>
 4 # include<ctime>
 5 # include<cstdlib>
 6 # define INF 0x3f3f3f3f
 7 
 8 using namespace std;
 9 
10 int cmp[16][16];
11 char data[100005][6];
12 
13 int solve(int q,int w)
14 {
15     int a,b,ret=0;
16     for(int i=0; i<5; i++)
17     {
18         char x = data[q][i];
19         char y = data[w][i];
20         if(x>='0' && x<='9')
21             a = x-'0';
22         else
23             a = x-'A' + 10;
24         if(y>='0' && y<='9')
25             b = y-'0';
26         else
27             b = y-'A' + 10;
28         ret += cmp[a][b];
29     }
30     return ret;
31 }
32 int main()
33 {
34     int i,j;
35     for(i=0; i<16; i++)
36     {
37         for(j=0; j<16; j++)
38         {
39             int ans=0;
40             int tmp = i^j;
41             for(int k=0; k<4; k++)
42                 if((1<<k) & tmp)
43                     ans ++;
44             cmp[i][j] = ans;
45         }
46     }
47 
48     int T,n;
49     scanf("%d",&T);
50     while(T--)
51     {
52         scanf("%d",&n);
53         for(i=1; i<=n; i++)
54             scanf("%s",data[i]);
55         int ans = INF;
56         srand((unsigned)time(NULL));
57         for(i=1; i<=60000; i++)
58         {
59             int a = rand()%n + 1;
60             int b = rand()%n + 1;
61             if(a==b)
62                 b= b%n+1;
63             int tmp = solve(a,b);
64             if(tmp < ans)
65                 ans = tmp;
66         }
67         printf("%d\n",ans);
68     }
69     return 0;
70 }

 

代码2:

 1 # include<iostream>
 2 # include<cstdio>
 3 # include<cstring>
 4 # include<ctime>
 5 # include<cstdlib>
 6 # define INF 0x3f3f3f3f
 7 
 8 using namespace std;
 9 
10 int data[100005];
11 
12 int get_one(int x)
13 {
14     int ret = 0;
15     while(x)
16     {
17         ret ++;
18         x = x&(x-1);
19     }
20     return ret;
21 }
22 int main()
23 {
24     srand((unsigned)time(NULL));
25     int T,n,i;
26     scanf("%d",&T);
27     while(T--)
28     {
29         scanf("%d",&n);
30         for(i=0; i<n; i++)
31             scanf("%x",&data[i]);
32         int ans = INF;
33         for(i=100005; i>=0; i--)    //好奇怪,这里从前往后循环返回WA
34         {
35             int a = rand()%n ;
36             int b = rand()%n ;
37             if(a != b)
38                 ans = min(ans,get_one(data[a]^data[b]));
39         }
40         printf("%d\n",ans);
41     }
42     return 0;
43 }

 

转载于:https://www.cnblogs.com/acm-bingzi/p/3327776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值