题目链接:Hamming Distance
解题思路:这里数据量比较大,给的时间是3S,怎么都搞不过,最后看了下网上的解法,是用的随机化的算法,用随机数随机抽选两个比较,随机次数越多,答案会越接近。这里答案只能是1~20。我认为当题目中的数据量变大时,答案中1,2出现频率比较高。但是这个随机化算法到底对不对,我也无法论证。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define MAX 100000
const int v[16] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};//这里是每一个数二进制中1的个数 0 ~ 15
int table[16][16];//两数相异或答案中1的个数
char str[MAX][5];
int calc(int x, int y){
int i, ans = 0;
for(i = 0; i < 5; i++){
int a, b;
if(str[x][i] >= 'A' && str[x][i] <= 'F'){
a = 10 + str[x][i] - 'A';
}
else{
a = str[x][i] - '0';
}
if(str[y][i] >= 'A' && str[y][i] <= 'F'){
b = 10 + str[y][i] - 'A';
}
else{
b = str[y][i] - '0';
}
ans += table[a][b];
}
return ans;
}
int main(){
int i, j, k, t, n;
int ans = 30;
srand((unsigned)time(NULL));
for(i = 0; i < 16; i++){
for(j = 0; j < 16; j++){
table[i][j] = v[i ^ j];
}
}
scanf("%d", &t);
while(t--){
ans = 30;
scanf("%d", &n);
getchar();
for(i = 0; i < n; i++){
scanf("%s", &str[i]);
}
for(i = 0; i < 900000; i++){//这里是90W次
int a = rand() % n;
int b = rand() % n;
if(a == b){
continue;
}
int tem = calc(a, b);
ans = ans > tem ? tem : ans;
}
printf("%d\n", ans);
}
return 0;
}