标签:usaco
开始的时候没有什么思路,后面看了一下数据范围不大,直接就暴力了。
其实我们只需要从题目中给定的0–2^B-1这些数中从小到大选n个出来就行了,只需要满足每次选择的数和前面已选的数的Hamming距离必须不小于D。
代码如下:
/*
ID: 15674811
LANG: C++
TASK: hamming
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std;
int n,B,D,cnt,ans[100];
bool check(int x)
{
for(int i=1;i<cnt;i++)
{
int c=0;
for(int d=0;d<B;d++)
if(((1<<d)&x)!=((1<<d)&ans[i]))
c++;
if(c<D)
return false;
}
return true;
}
int main()
{
ofstream fout("hamming.out");
ifstream fin("hamming.in");
//ifstream fin("lkl.txt");
while(fin>>n>>B>>D)
{
cnt=1;
int k=(1<<B)-1;
for(int i=0;i<=k;i++)
{
if(check(i))
ans[cnt++]=i;
if(cnt>n)
break;
}
for(int i=1;i<cnt;i++)
{
fout<<ans[i];
if((i!=0&&i%10==0)||(i==n))
fout<<endl;
else
fout<<" ";
}
}
return 0;
}
标签:usaco
原文地址:http://blog.csdn.net/acm_lkl/article/details/44239577