02. dp求期望的題。
03. 題意:
04. 有n個房間,由n-1條隧道連通起來,實際上就形成了一棵樹,
05. 從結點1出發,開始走,在每個結點i都有3種可能:
06. 1.被殺死,回到結點1處(概率為ki)
07. 2.找到出口,走出迷宮 (概率為ei)
08. 3.和該點相連有m條邊,隨機走一條
09. 求:走出迷宮所要走的邊數的期望值。
10.
11. 設 e[i]表示在結點i處,要走出迷宮所要走的邊數的期望。e[1]即為所求。
12.
13. 葉子結點:
14. e[i] = ki*e[1] + ei*0 + (1-ki-ei)*(e[father[i]] + 1);
15. = ki*e[1] + (1-ki-ei)*e[father[i]] + (1-ki-ei);
16.
17. 非葉子結點:(m為與結點相連的邊數)
18. e[i] = ki*e[1] + ei*0 + (1-ki-ei)/m*( e[father[i]]+1 + ∑( e[child[i]]+1 ) );
19. = ki*e[1] + (1-ki-ei)/m*e[father[i]] + (1-ki-ei)/m*∑(e[child[i]]) + (1-ki-ei);
20.
21. 設對每個結點:e[i] = ai*e[1] + bi*e[father[i]] + ci;
22.
23. 對於非葉子結點i,設j為i的孩子結點,則
24. ∑(e[child[i]]) = ∑e[j]
25. = ∑(aj*e[1] + bj*e[father[j]] + cj)
26. = ∑(aj*e[1] + bj*e[i] + cj)
27. 帶入上面的式子得
28. (1 - (1-ki-ei)/m*∑bj)*e[i] = (ki+(1-ki-ei)/m*∑aj)*e[1] + (1-ki-ei)/m*e[father[i]] + (1-ki-ei) + (1-ki-ei)/m*∑cj;
29. 由此可得
30. ai = (ki+(1-ki-ei)/m*∑aj) / (1 - (1-ki-ei)/m*∑bj);
31. bi = (1-ki-ei)/m / (1 - (1-ki-ei)/m*∑bj);
32. ci = ( (1-ki-ei)+(1-ki-ei)/m*∑cj ) / (1 - (1-ki-ei)/m*∑bj);
33.
34. 對於葉子結點
35. ai = ki;
36. bi = 1 - ki - ei;
37. ci = 1 - ki - ei;
38.
39. 從葉子結點開始,直到算出 a1,b1,c1;
40.
41. e[1] = a1*e[1] + b1*0 + c1;
42. 所以
43. e[1] = c1 / (1 - a1);
44. 若 a1趨近於1則無解...
45.**/
#include #include #include #include using namespace std;
const int maxn = 10000 + 5;
double e[maxn], k[maxn];
double a[maxn], b[maxn], c[maxn];
vectorv[maxn];
bool search(int i, int fa)
a[i] = k[i];
b[i] = (1 - k[i] - e[i]) / v[i].size();
c[i] = 1 - k[i] - e[i];
double tmp = 0;
for (int j = 0; j < (int)v[i].size(); j++)
if ( fabs(tmp - 1) < 1e-10 ) return false;
a[i] /= 1 - tmp;
b[i] /= 1 - tmp;
c[i] /= 1 - tmp;
return true;
}
int main()
for ( i = 1; i <= n; i++)
cout << "case " << ca << ": ";
if ( search(1, -1) && fabs(1 - a[1]) > 1e-10 )
cout << c[1]/(1 - a[1]) << endl;
else
cout << "impossible" << endl;
} return 0;
}
成都賽區網路賽 hdu 4292 food
題目 給出n個人喜歡的飲料種類以及食物種類,每個人只能取其中一種且數量為1,現在給出有f中食物以及d種飲料,以及他們各自的數量,問如何安 排食物以及飲料,使得最多的人得到乙個食物以及一瓶飲料 題目類似poj3281 dining 只是那題目每個種類都只有數量1 所以這道題目就只用才起點建邊和終點建邊...
acm成都賽區網路熱身賽 Sum
題目大意 給你乙個n和x n的範圍 n 1000001 n表示有n個數,在這n個數查詢是否有兩個數之和為x的,如果有就輸出 yes 沒有 no sample input 3 3 1 2 3 2 31 3sample output yesno 最後我編了一組測試資料 3 16 1 8 16 no用二分...
hdu 4288 Coder 成都賽區 線段樹
題意 給出乙個有序集合,3種操作。插入乙個數,刪除乙個數,都保證序列有序。以及求和 其中求和是將下標 5 3的所有數求和 題解 線段樹 離散化 離線處理 一開始也是想的 線段樹 但是 這個和以前的 做過的 乙個線段樹 不同的 是 如果 我們 刪除 乙個 元素後 那麼 他的 下標 將會 改變 比賽是 ...