NOIP2013模擬 太鼓達人

2021-08-21 10:48:57 字數 1835 閱讀 9089

我們可以先將所有的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 ...