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 70. Climbing Stairs
你正在爬楼梯。 它需要n步才能达到顶峰。 每次你可以爬1或2步。 您可以通过多少不同的方式登顶? 注意:给定n将是一个正整数。
42 0
LeetCode 70. Climbing Stairs
Leetcode-Easy 461.Hamming Distance
Leetcode-Easy 461.Hamming Distance
90 0
Leetcode-Easy 461.Hamming Distance
Leetcode-Easy 70. Climbing Stairs
Leetcode-Easy 70. Climbing Stairs
82 0
Leetcode-Easy 70. Climbing Stairs
|
人工智能
HDOJ 1028 Ignatius and the Princess III(递推)
HDOJ 1028 Ignatius and the Princess III(递推)
100 0
HDOJ/HDU 2552 三足鼎立(tan()和atan()方法)
HDOJ/HDU 2552 三足鼎立(tan()和atan()方法)
100 0
HDOJ/HDU 2552 三足鼎立(tan()和atan()方法)
LeetCode之Hamming Distance
LeetCode之Hamming Distance
101 0
HDOJ/HDU 2552 三足鼎立(tan()和atan()方法)
Problem Description MCA山中人才辈出,洞悉外界战火纷纷,山中各路豪杰决定出山拯救百姓于水火,曾以题数扫全场的威士忌,曾经高数九十九的天外来客,曾以一剑铸十年的亦纷菲,歃血为盟,盘踞全国各个要塞(简称全国赛)遇敌杀敌,遇佛杀佛,终于击退辽军,暂时平定外患,三人位置也处于稳态。
946 0
数论 - Funny scales(SPOJ - SCALE)
Funny scales  Problem's Link  ---------------------------------------------------------------------------- Mean:  给定两个数n和x,有一个天平,初始时左盘为x,你需要从以下集合中选一些数字来放到两个盘中,使得两个盘相等(note:每个数字只能取一次)。
1021 0