game on tree
題意:有一顆樹,每一步選擇乙個節點,則這個節點以及它的子樹上所有節點都會被染色,問染色完整棵樹需要的步數的期望值
分析:由於以前沒怎麼做過求期望的題,我看到這題的第一想法是找出所有的染色方法,計算他們的步數的平均值,但是這樣想想就很複雜…
所以正確的解法利用期望的乙個性質-------期望線性性
如上圖的樹,每乙個節點是否被染色取決於它自己以及它的祖輩節點有沒有被染色
例如對於6號節點,只有1號,3號和6號節點會影響到它的染色情況
如果操作發生在1,3上,6號只是被間接染色,只有直接操作6號時它才是直接染色
所以6號節點被操作的概率為1/3,又因為操作一次為一步,所以6號節點步數的期望為1*1/3=1/3
依此可推出各點的步數期望,再結合期望的線性性,求和即為答案
**:
#include
using namespace std;
const
int maxn =
1e5+10;
vector<
int> ve[maxn]
;int deep[maxn]=;
int vis[maxn]=;
void
dfs(
int k,
int d)}}
intmain
(int argc,
char
const
*ar**)
dfs(1,
1);double ans =0;
for(
int i =
1; i <= n;
++i)
ans +
=1.0
/ deep[i]
;printf
("%.20f\n"
, ans)
;return0;
}
期望線性時間選擇
在乙個由n個元素組成的集合裡,第i個順序統計量 order statistic 是該集合中第i 小的元素。比如 在一組元素的集合中,最小值是第1個順序統計量 i 1 而最大值是第n個順序統計量 i n code include include include void swap int a,int ...
期望為線性時間選擇演算法
一般選擇問題看起來要比我麼找最小值這樣的簡單問題更難。但這兩個問題的漸進執行時間卻是相同的 n randomized select演算法,以快速排序演算法為模型。與快速排序不同的是,快速排序會遞迴處理劃分的兩邊,而randomized select只處理劃分的一邊。快速排序執行的時間是 n n 而r...
期望為線性的選擇演算法
以快排為模型,對陣列遞迴劃分,但遞迴後只處理包含所查第 個元素的那邊,如此遞迴下去直至查詢成功 無 這裡的partition就是其中的randomized partition include int randomized partition int a,int p,int r temp a i 1 ...