比赛 |
20140713下午练习 |
评测结果 |
AAAAAAAAAA |
题目名称 |
海明码 |
最终得分 |
100 |
用户昵称 |
(⊙o⊙)… |
运行时间 |
0.020 s |
代码语言 |
Pascal |
内存使用 |
15.44 MiB |
提交时间 |
2014-07-13 15:41:51 |
显示代码纯文本
var
two:array[0..10]of longint;
f:array[0..2000,0..2000]of longint;
t:array[0..100]of longint;
ans:array[0..100]of longint;
n,b,d,tot,i,j,k,l1,l2:longint;
en:boolean;
procedure find(rank,num,top:longint);
var i,j:longint; f0:boolean;
begin
if en then exit;
if num=n
then begin
j:=0;
for i:=1 to n do j:=j+t[i];
if j<tot
then
begin
tot:=j;
for i:=1 to n do ans[i]:=t[i];
en:=true;
end;
end
else begin
for i:=rank+1 to two[b+1] do
if top+(n-num)*i<tot then
begin
f0:=true;
for j:=1 to num do
if f[t[j],i]<d
then begin
f0:=false;
break;
end;
if f0 then
begin
t[num+1]:=i;
find(i,num+1,top+i);
end;
end
else break;
end;
end;
begin
assign(input,'hamming.in');reset(input);
assign(output,'hamming.out');rewrite(output);
readln(n,b,d);
two[1]:=1;
for i:=2 to b+1 do two[i]:=two[i-1]*2;
for i:=0 to two[b+1] do
for j:=i+1 to two[b+1] do
begin
l1:=i;
l2:=j;
for k:=1 to b do
begin
if (l1 mod 2)<>(l2 mod 2) then inc(f[i,j]);
l1:=l1 div 2;
l2:=l2 div 2;
end;
end;
tot:=1000000;
en:=false;
find(-1,0,0);
i:=0;
while i<>n do
begin
inc(i);
if i mod 10=1
then write(ans[i])
else write(' ',ans[i]);
if i mod 10=0 then writeln;
end;
if n mod 10 <>0 then writeln;
close(input);
close(output);
end.