题目链接: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; }