題目描述
六一到了,為了慶祝這個節日,好多商家都推出了很多好玩的小遊戲。tongtong看到了乙個猜球球的遊戲,有n種除了顏色之外完全相同的球,商家從中拿出來乙個球球放到了箱子裡,已知第i種顏色的球出現在箱子裡的概率為ai。tongtong可以用下面這種方法來確定箱子中球的顏色:向商家提出猜測:「是第x種顏色的球球或第y種顏色的球球或...........中的乙個」,商家會回答你的猜測是正確還是錯誤的,直到你有百分百的把握確定箱子裡的球球,猜測的次數越少,tongtong能夠得到的禮物就更好。為了讓tongtong過乙個開開心心的六一,請你找出一種最優的策略,盡可能少的向店主提出猜測來確定球的顏色,輸出猜測次數的期望值。
策略「最優」是指:猜測次數的期望最小。當你有百分百的把握確定箱子裡的球球顏色種類時,則不需要繼續猜測。例如,如果有兩種顏色的球球,箱子裡放的是第二種顏色的球球,你可以猜測「是第一種顏色的球球」。商家會告訴你「錯誤」,所以你可以推測「箱子裡的球球是第二種顏色的」,並且有百分百的把握,所以你就可以結束猜測而不需要額外的一次猜測。這種詢問方式猜測次數為一次(不管你這一次有沒有猜對)。
輸入第一行輸入乙個n,表示有n種顏色的球。 n<=2 000
第二行輸入n個非負小數a1~an,表示是第i種顏色球球的概率,保證加和起來為1。
輸出輸出最小期望,保留7位小數。
複製樣例資料
3樣例輸出0.5000000000 0.2500000000 0.2500000000
1.5000000提示
最佳策略下:第一次詢問「是不是第二種顏色的球球或第三種顏色的球球中的一種」,如果回答「否」則可以知道是第一種顏色的球球,結束詢問;如果回答是「是」則詢問第二次「是不是第二種顏色的球球」。
思路:詢問決策可構成乙個二叉決策樹;這種詢問決策下的詢問次數的期望等於∑(每個葉子結點的深度*出現概率);要使其最小,則構建哈夫曼樹。注意概率為0的球不需考慮。
ac**:
#includeusingview codenamespace
std;
double p[2005
];struct
node
};priority_queue
q;int
main()
); }
double ans=0
;
while(q.size()>=2
)); }
printf(
"%.7f\n
",ans);
return0;
}
問題 F 猜球球 XUPT2019 哈夫曼樹
題目描述 六一到了,為了慶祝這個節日,好多商家都推出了很多好玩的小遊戲。tongtong看到了乙個猜球球的遊戲,有n種除了顏色之外完全相同的球,商家從中拿出來乙個球球放到了箱子裡,已知第i種顏色的球出現在箱子裡的概率為ai。tongtong可以用下面這種方法來確定箱子中球的顏色 向商家提出猜測 是第...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....
哈夫曼樹 哈夫曼編碼
定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...