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 }
posted on 2015-03-20 15:52 IceDream61 阅读(320) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端