USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
  找出N个二进制数,每个数有B位,使得各数两两之间“海明距离”至少为D。(若有多组解,输出字典序最小的。)
  海明距离是指:两个二进制数不同二进制位的个数。
【数据范围】
  1<=N<=64
  1<=B<=8
  1<=D<=7
【输入格式】
  一行三个数N、B、D,空格分割。
【输出格式】
  从小到大输出,每行输出十个数。
【输入样例】
  16 7 3
【输出样例】
  0 7 25 30 42 45 51 52 75 76
  82 85 97 102 120 127
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
  又是一道枚举,贪心即可。
  最多256个数,从0开始扫(从小到大),能取的就取了,并且把所有与之距离小于D的数“删掉”。这样一来,取的就只可能是最优解了。由于本题不可能无解(题目都没说无解咋办,当然有解。。),而且删数的时间也就是256,因此总时间比62500稍大,常熟大约是8,完全可以接受。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
  第二次AC。
  第一次提交没过,忘了USACO要求的输出末尾换行。。

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

 1 /*

 2 ID: icedrea1

 3 PROB: hamming

 4 LANG: C++

 5 */

 6 

 7 #include <iostream>

 8 #include <fstream>

 9 using namespace std;

10 

11 void DtoB(int num)

12 {

13     int bit[10],l=0;

14     while(num) { bit[l++]=num&1; num>>=1; }

15     for(int i=l;i<7;++i) cout<<0;

16     for(int i=l-1;i>=0;--i) cout<<bit[i];

17 }

18 void look()

19 {

20     ifstream in("hamming.out");

21 

22     int num;

23     while(in>>num)

24     {

25         DtoB(num);

26         cout<<endl;

27     }

28 

29     in.close();

30 }

31 

32 // just a look -----------------------------------------------------------

33 // go~!

34 

35 int N,B,D;

36 bool have[256];

37 

38 int num[64],sum;

39 

40 int dis(int x,int y)

41 {

42     int s=0;

43     while(x||y) { s+=(x^y)&1; x>>=1; y>>=1; }

44     return s;

45 }

46 

47 void del(int x)

48 {

49     for(int y=0;y<(1<<B);++y)

50         if(dis(x,y)<D) have[y]=false;

51 }

52 

53 void print(ostream &out)

54 {

55     for(int i=0;i<sum-1;++i) out<<num[i]<<(i%10==9?"\n":" ");

56     out<<num[sum-1]<<endl;

57 }

58 

59 int main()

60 {

61     //look(); return 0;

62     ifstream in("hamming.in");

63     ofstream out("hamming.out");

64 

65     in>>N>>B>>D;

66     for(int x=0;x<(1<<B);++x) have[x]=true;

67     for(int x=0;x<(1<<B) && sum<N;++x)

68     {

69         if(!have[x]) continue;

70         num[sum++]=x; del(x);

71     }

72 

73     if(sum<N) out<<"not enough!"<<endl; else print(out);

74 

75     in.close();

76     out.close();

77     return 0;

78 }

 

你可能感兴趣的:(USACO)