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 }
  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/icedream61/p/4353836.html
Copyright © 2011-2022 走看看