我們可以把由「0」和「1」組成的字串分為三類:全「0」串稱為b串,全「1」串稱為i串,既含「0」又含「1」的串則稱為f串。
fbi樹是一種二叉樹,它的結點型別也包括f結點,b結點和i結點三種。由乙個長度為2^n的「01」串s可以構造出一棵fbi樹t,遞迴的構造方法如下:
1) t的根結點為r,其型別與串s的型別相同;
2) 若串s的長度大於1,將串s從中間分開,分為等長的左右子串s1和s2;由左子串s1構造r的左子樹t1,由右子串s2構造r的右子樹t2。
現在給定乙個長度為2^n的「01」串,請用上述構造方法構造出一棵fbi樹,並輸出它的後序遍歷序列。輸入格式:
第一行是乙個整數n(0 <= n <= 10),第二行是乙個長度為2^n的「01」串。
輸出格式:
包括一行,這一行只包含乙個字串,即fbi樹的後序遍歷序列。
輸入樣例#1:
3輸出樣例#1:10001011
ibfbbbfibfiiiff對於40%的資料,n <= 2;
對於全部的資料,n <= 10。
noip2004普及組第3題
事先說明 我的方法很愚蠢 只是為了接觸樹的一些演算法
那麼。。。樹這種神奇的東西,題目中的樹是滿二叉樹。。。所以可用三個陣列表示:
tree[i] 第i個節點的字元('f','b','i')
treel[i] 第i個節點的左子樹
treer[i] 第i個節點的右子樹
當然要自下而上構建樹更好。。。不解釋 然後後序遍歷一遍即可
——2015.12.29
var n,t,i,t1:longint;
s:ansistring;
tree:array[0..3000] of char;
treel,treer:array[0..2049] of integer;
procedure ok(t:longint); //後序遍歷
begin
if t=0 then exit;
ok(treel[t]); //後序遍歷 左 右 中
ok(treer[t]);
write(tree[t]);
end;
begin
readln(n);
readln(s);
if n=0 then begin //特殊情況特殊考慮~
if s='1' then writeln('i')
else writeln('b');
close(input);
close(output);
halt;
end;
t:=1;
for i:=1 to n do t:=t*2;
for i:=t to 2*t-1 do begin //把樹的「葉子」(即底層)構建好
inc(t1);
if s[t1]='0' then tree[i]:='b'
else tree[i]:='i';
end;
for i:=t-1 downto 1 do begin //(自下而上構建)
treel[i]:=2*i;//不解釋
treer[i]:=2*i+1; //不解釋
if (tree[2*i]='b')and(tree[2*i+1]='b') then tree[i]:='b'
else if (tree[2*i]='i')and(tree[2*i+1]='i') then tree[i]:='i'
else tree[i]:='f'; //判斷當前節點的字元
end;
ok(1);
end.
重走普及路 貪心 合併果子
在乙個果園裡,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把所有的果子合成一堆。每一次合併,多多可以把兩堆果子合併到一起,消耗的體力等於兩堆果子的重量之和。可以看出,所有的果子經過n 1次合併之後,就只剩下一堆了。多多在合併果子時總共消耗的體力等於每次合併所耗體力之和。...
NOIP 2004 普及組 複賽 FBI樹
noip 2004 普及組 複賽 fbi樹 1.閱讀題目,還有些不知所云。2.對樣例進行手動模擬,弄明白題意了。fbi樹如下圖所示 ff f f b f i i b b b i b i i 1 t的根結點為r,其型別與串s的型別相同 此句是核心中的核心,也即f b i三種根節點。3.接下來程式設計實...
重走普及路 分治 經典演算法 快速冪
輸入b,p,k的值,求b p mod k的值。其中b,p,k k為長整型數。輸入格式 三個整數b,p,k.輸出格式 輸出 b p mod k s s為運算結果 輸入樣例 1 2 10 9輸出樣例 1 2 10 mod 9 7分治,即 將大問題拆分為小問題,分而治之,各個擊破,然後在合併回來。firs...