zoukankan      html  css  js  c++  java
  • 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?"
    ":" ");
    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 }
  • 相关阅读:
    语法树,短语,直接短语,句柄
    理解文法和语法
    了解编译原理
    实习日记7.20
    实习日记7.19
    实习日记7.18
    实习日记7.15
    实习日记7.13-7.14
    实习日记7.12
    实习日记7.11
  • 原文地址:https://www.cnblogs.com/icedream61/p/4353836.html
Copyright © 2011-2022 走看看