USACO--2.1Hamming Codes

开始的时候没有什么思路,后面看了一下数据范围不大,直接就暴力了。
其实我们只需要从题目中给定的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)