HDU 4712 Hamming Distance

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


 

你可能感兴趣的:(HDU 4712 Hamming Distance)