我先解释一下汉明距离 以下来自百度百科
这个题是让你求n个数两两之间最小的汉明距离,而且规定了每个数是长度为5的16进制数,可以想到求出最大的值为20,最小为10。 没想到什么好的算法,看了人家的解题报告,依靠RP,随机找1000000对点求最小值,不过还是过了。
#include<algorithm> #include<stdio.h> #include <stdlib.h> #define inf 1000000007 using namespace std; int M[100005]; int count(int x,int y) { int sum=0,p=x^y; while (p) sum+=p%2,p>>=1; return sum; } int main() { int T,y,n,d,i,j,x; scanf("%d",&T); while (T--) { scanf("%d",&n); for (i=1;i<=n;i++) { scanf("%X", &M[i]); } int ans=inf; for (i=1;i<=1000000;i++) { x=rand()%n+1; y=rand()%n+1; if (x==y) continue; ans=min(ans,count(M[x],M[y])); } printf("%d\n",ans); } return 0; }