我們可以先將所有的01串按字典序從小到大做出來。我們很容易發現(打表找規律),將全0串放最前面明顯是最優的。所以,我自然而然地想到了貪心。
我們先設f[i],將01串按上述做好。設m[i]為第i次檢查出的01串是f陣列中的第m[i]個,dg判斷是否能放入,可以就往下dg。如果方案成立直接輸出。
當dg查詢到第x層(x>2^n-n+1)時,我們就要特殊處理,因為查詢會迴圈到頭,所以我們要判斷在末尾的那段是否成立,且該01串結尾是否都為0。
var
n,k,i,j,o,l,q:longint;
bz:array[1..4096]of boolean;
m:array[1..4096]of longint;
p:char;
ans,g:ansistring;
f:array[1..4096]of string;
procedure
dg(x:longint);
var i,j,w:longint;
bj:boolean;
begin
if (x=k+1) then
begin
write(k,' ',f[1]);
for i:=2
to k-n+1
dowrite(f[m[i],n]);
writeln;
halt;
end;
if (x>k-n+1) then w:=k-x+1
else w:=n-1;
for i:=1
to k do
begin
bj:=false;
if (bz[i]=false) then
begin
for j:=1
to w do
begin
if (f[i,j]<>f[m[x-1],j+1]) then
begin
bj:=true;
break;
end;
end;
if (w<>n-1) then
begin
for j:=w+1
to n do
if (f[i,j]<>'0') then bj:=true;
end;
if (bj=false) then
begin
bz[i]:=true;
m[x]:=i;
dg(x+1);
bz[i]:=false;
end;
end;
end;
end;
begin
readln(n);
k:=1;
for i:=1
to n do
k:=k*2;
o:=k div
2; while (o<>0) do
begin
p:='1';
l:=1;
for i:=1
to k div o do
begin
q:=(ord(p)-47)mod
2; p:=chr(q+48);
for j:=l to l+o-1
do f[j]:=f[j]+p;
inc(l,o);
end;
o:=o div
2; end;
ans:='2';
m[1]:=1;
bz[1]:=true;
dg(2);
end.
3033太鼓達人
鼓的主要元件是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。而且鼓的設計很精密,m會取到可能的最大值。現在vani已經了解到了k的值,他希望你求出m...
太鼓達人 C組模擬賽
是m個圍成一圈的感測器。每個感測器都有開和關兩種工作狀態,分別用1和0表示。顯然,從不同的位置出發沿順時針方向連續檢查k個感測器可以得到m個長度為k的01串。vani知道這m個01串應該是互不相同的。m會取到可能的最大值。現在vani已經了解到了k的值,他希望你求出m的值,並給出字典序最小的感測器排...
模擬 NOIP 2013 花匠
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...