本文主要是介绍P1461 海明码 Hamming Codes,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
给出 n,b,dn,b,d,要求找出 nn 个由 0,10,1 组成的编码,每个编码有 bb 位),使得两两编码之间至少有 dd 个单位的 “Hamming距离”。“
Hamming距离”是指对于两个编码,他们二进制表示法中的不同二进制位的数目。看下面的两个编码 0x554 和 0x234(十六进制数)
0x554 = 0101 0101 0100
0x234 = 0010 0011 0100
不同位 xxx xx
因为有五个位不同,所以“Hamming距离”是 55。
输入格式
一行,包括 n,b,dn,b,d。
输出格式
nn 个编码(用十进制表示),要排序,十个一行。
如果有多解,你的程序要输出这样的解:假如把它化为 2^b2
b
进制数,它的值要最小。
输入输出样例
输入 #1复制
16 7 3
输出 #1复制
0 7 25 30 42 45 51 52 75 76
82 85 97 102 120 127
说明/提示
【数据范围】
对于 100%100% 的数据,1\le n \le 641≤n≤64,1\le b \le 81≤b≤8,1\le d \le 71≤d≤7。
请解释:“必须与其他所有的数相比,Hamming 距离都符合要求,这个数才正确”
答:如样例输出,0,70,7,0,250,25,比较都符合海明码,同样 7,257,25,7,307,30,比较也符合要求,以此类推。题中至少有 dd 个单位,意思就是大于等于 dd 个单位的都可以。
USACO 2.1
翻译来自NOCOW
思路: 一开始还真没看懂题。其实就是最多8位,然后你顺序找出所有二进制位差异大于等于d的数。异或后1的位数就是差异数。
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;int a[1005];
int n,b,d;
int cnt;int cal(int x)
{int res = 0;while(x){res += x & 1;x >>= 1;}return res;
}int check(int x)
{for(int i = 1;i <= cnt;i++){if(cal(x ^ a[i]) < d){return false;}}return true;
}int main()
{scanf("%d%d%d",&n,&b,&d);for(int i = 0;i < (1 << b);i++){if(check(i)){a[++cnt] = i;}}for(int i = 1;i <= n;i++){printf("%d",a[i]);if(i % 10 == 0)printf("\n");else if(i != n)printf(" ");}return 0;
}
这篇关于P1461 海明码 Hamming Codes的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!