hdoj 4712 Hamming Distance(靠人品过的)

简介: 在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的字符不同的个数。换句话说,它就是将 一个字符串变换成另外一个字符串所需要替换的字符个数。

我先解释一下汉明距离  以下来自百度百科


在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的字符不同的个数。换句话说,它就是将 一个字符串变换成另外一个字符串所需要替换的字符个数。 例如:

* 1 与 0 之间的汉明距离是 1。

* 214 与 214 之间的汉明距离是 0。

* "abcd" 与 "aacd" 之间的汉明距离是 1。

汉明重量是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是 1 的个数,所以 11101 的汉明重量是 4。

汉明距离在信息论、密码学等方向有很重要的应用。

这个题是让你求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;
}
目录
相关文章
Leetcode-Easy 461.Hamming Distance
Leetcode-Easy 461.Hamming Distance
109 0
Leetcode-Easy 461.Hamming Distance
|
算法 Go
HDU-1548,A strange lift(Dijkstra)
HDU-1548,A strange lift(Dijkstra)
|
人工智能
HDOJ 1028 Ignatius and the Princess III(递推)
HDOJ 1028 Ignatius and the Princess III(递推)
118 0
|
Java C语言
HDOJ/HDU 1029 Ignatius and the Princess IV(简单DP,排序)
HDOJ/HDU 1029 Ignatius and the Princess IV(简单DP,排序)
139 0
HDOJ 2080 夹角有多大II
HDOJ 2080 夹角有多大II
95 0
HDOJ/HDU 1372 Knight Moves(经典BFS)
HDOJ/HDU 1372 Knight Moves(经典BFS)
134 0