[2016/7/20][usaco 2.1]Hamming Codes

来源:互联网 发布:打印发票软件 编辑:程序博客网 时间:2024/05/21 07:01

http://train.usaco.org/usacoprob2?a=JavNK9GpMNL&S=hamming

因为输出格式的问题连wa好几下,最讨厌这种不标注输出格式让你自己观察的题了!!

这道题直接暴力过的,因为数据范围比较小。最坏情况是C81一直加到C88,直接暴力搜就好了,方法同上一道饲料题。要求数字最小,所以先排个序,然后遍历,找符合条件的即可。

上一道题看有人用stl 的bitset库,觉得挺好玩,所以这道题也试着用了用。直接把二进制数字转换成整数的函数实在太好用了!还可以直接创建bitset类型的数组,很方便。

bitset库常见用法:

1.bitset<n> b:创建一个n位的,每位都为0的二进制数

1.b.to_ulong():把b转化为整数

代码如下:

/* ID:49743541 LANG:C++ TASK:hamming */  #include <stdio.h>#include <iostream>#include <bitset>#include <algorithm>using namespace std;int N,B,D;bitset<8> b[100000];bitset<8> num;bool mark[100000];int n = 0;bool compare(bitset<8> A,bitset<8> B){if(A.to_ulong()<B.to_ulong())return true;return false;}void dfs(int wei,int amount){//printfif(wei==B) return;if(amount>=D){b[n] = num;n++;}num[wei+1] = 1; dfs(wei+1,amount+1);num[wei+1] = 0; dfs(wei+1,amount);}int main(){freopen("hamming.in","r",stdin);      freopen("hamming.out","w",stdout);  scanf("%d%d%d",&N,&B,&D);//D是距离,B是位数,N是数量 dfs(-1,0);sort(b,b+n,compare);int begin = 1;int j;cout<<0;for(int i = 0;i<n;i++){if(begin==N) break;for(j = 0;j<n;j++){if(mark[j]&&i!=j){int shuliang = 0;for(int k = 0;k<B;k++){if(b[j][k]!=b[i][k])shuliang++;}if(shuliang<D) break;}}if(j==n) {mark[i] = true;begin++;if(begin!=1&&begin%10==1)cout<<endl<<b[i].to_ulong();elsecout<<" "<<b[i].to_ulong();}}cout<<endl;/*for(int i=0;i<n;i++){cout<<endl;cout<<b[i].to_ulong()<<" "<<b[i]<<endl;}*/return 0;} 


0 0
原创粉丝点击