题意:一个岛上有你,t头老虎,d头鹿,每天都有两种生物见面:
(1)你和老虎见面,你死翘翘。
(2)鹿和老虎见面,鹿死翘翘。
(3)老虎和老虎见面,都死翘翘。
(4)鹿和鹿见面,相安无事。
(5)你和鹿见面,杀不杀鹿取决于你。
直到有一天你可以保证自己不会死,输出得到这个结果的期望概率。
题解:概率dp
奇数个老虎,必死的局,考虑偶数,让老虎碰上自己概率最小,不杀鹿。
用
d
p
[
i
]
dp[i]
dp[i]表示剩
i
i
i头老虎时还没死的概率。
因为与鹿无关,不考虑鹿。
总事件=虎遇到虎+虎遇到你
i
∗
(
i
−
1
)
/
2
+
i
i * (i - 1) / 2+i
i∗(i−1)/2+i
没死事件=虎遇到虎
i
∗
(
i
−
1
)
/
2
i * (i - 1) / 2
i∗(i−1)/2
d
p
[
i
]
+
=
d
p
[
i
+
2
]
∗
dp[i]+=dp[i+2]*
dp[i]+=dp[i+2]∗没死/总,
d
p
[
t
]
=
1
dp[t]=1
dp[t]=1
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
int t, a, b, n;
double dp[1111];
int main() {
scanf("%d", &t);
int cas = 0;
while (t--) {
scanf("%d%d", &a, &b);
memset(dp, 0, sizeof(dp));
dp[a] = 1;
if (a & 1) printf("Case %d: %d\n", ++cas, 0);
else {
for (int i = a; i >= 2; i -= 2) {
dp[i - 2] += dp[i] * (i * (i - 1) / 2) / (i * (i - 1) / 2 + i);
}
printf("Case %d: %f\n", ++cas, dp[0]);
}
}
return 0;
}