1020 小白鼠 哈夫曼樹

2021-06-12 14:48:07 字數 1695 閱讀 8227

1020 小白鼠

時間限制: 1秒  記憶體限制: 64m

description

有 n 個瓶子,已知其中有且僅有乙個瓶子的飲料有毒。現在我們想知道哪個瓶子的飲料有毒,於是找來一些小白鼠做測試。

假設我們有足夠多的小白鼠,為了加快測試速度,我們每次可以把來自若干個瓶子的測試樣本混在一起,餵給小白鼠。如果小白鼠喝了有毒的飲料,即死。

現在給你每個瓶子的飲料有毒的概率(和總是 100% ),問以最優策略(測試次數盡可能少)執行,期望的測試次數是多少?

input

輸入第一行為資料組數 t ( t <= 20 )。

對於每組資料,首先是乙個空行,接下來的第一行為瓶子的個數 n ( 1 <= n <= 100 )。 

再接下來的一行為 n 個實數 p1... pn ,表示每個瓶子中的飲料有毒的概率( sum = 1 )。

output

對於每組資料輸出乙個數,為期望的測試次數,小數點後保留兩位數字。

sample input3

30.5 0.25 0.25

40.25 0.25 0.25 0.25

20.00 1.00

sample output

1.50

2.00

1.00

hint

概率為 0 的事件未必是不可能事件,比如說在數軸上隨機選點,結果選中了乙個整點 ……

所以第三組樣例還是需要測一次的。

依舊,答案出於張偉大人的解題報告

內容是哈夫曼樹:構造二叉樹使其帶權路徑長度和最小

將給定的 n 哥節點構成 n 棵二叉樹的集合 f = 。其中每棵二叉樹 ti 只有乙個權值為 w1 的根節點,左右子樹均為空

在 f 中選取根結點的權值最小的兩棵二叉樹作為左右子樹,構造一棵新的二叉樹,其權值為左右子節點權值之和

在 f 中刪除這兩棵二叉樹,並把得到的新二叉樹加入 f 中。

重複步驟 2 3 ,直到 f 中只有一棵二叉樹為止。此時,此二叉樹即為所求哈夫曼樹,各個中間節點的權值之和即為此二叉樹的帶權路徑長度

例如:

使用陣列儲存哈夫曼樹,1~n 儲存原始 n 個節點,n ~ 2*n-2 儲存中間節點,2*n-1 儲存根結點。

根據例子可以得到儲存的哈夫曼樹為:16 2 18 16 23 18 34 41 75 

原題**:

#include

#include

#include

#define n 210

double

tree[n];  

intctree[n];  

intmin(

intk)  

}  ctree[num] = 1;  

return

num;  

}  int

main()  

for( i = n+1; i <= 2*n-1; i ++ ) ans += tree[i];  

printf("%.2lf\n"

,ans);  

}  return

0;  

}  

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...