题意:
在孤岛生存, 孤岛上有t头老虎,d头鹿, 每天会出现随机出现两只生物(包括你自己), 如果出现了一只老虎,那么你将被吃掉, 如果两只老虎, 则两只老虎会同归于尽,其他情况你都将生存下来。
当孤岛上没有老虎时, 就视为你生存成功。
问你生存成功的最大概率。
思路:
仔细想一想, 生存下来其实只和老虎有关, 因为你遇上其他情况, 你都会存活下来。
就相当于是一个0 - 1分布, 要么活下来, 要么被吃掉。
如果t只老虎是一个奇数, 那么必然存活失败, 因为老虎的消耗是成对的, 你要存活下来最基本的条件就是所有的老虎都同归于尽了, 或者没有老虎, 否则你总会有一天遇见老虎。
如果t只老虎是一个偶数, 那么不一定存活成功。
因为每天都会出现两只生物, 那么我们计算t只老虎同归于尽的最大概率。
每天随机出现两只生物,所有的情况数:t * (t + 1)(因为鹿与存活与否无关),两只老虎遇见的情况数:t * (t - 1)
概率P = t * (t - 1) / (t * (t + 1)) = (t - 1) / (t + 1)
代码:
1 #include <cmath>
2 #include <cstdio>
3 #include <cstring>
4 #include <cstdlib>
5 #include <ctime>
6 #include <set>
7 #include <map>
8 #include <list>
9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <fstream>
13 #include <iterator>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define LL long long
18 #define INF 0x3f3f3f3f
19 #define MOD 1000000007
20 #define eps 1e-6
21 #define MAXN 1010
22 int t, d;
23 double solve()
24 {
25 double ans = 0.0;
26 if(t % 2 == 1) return ans;
27 ans = 1.0;
28 if(t == 0) return ans;
29
30 int x = t;
31 while(x)
32 {
33 ans *= 1.0 * (x - 1.0) / (x + 1.0);
34 x -= 2;
35 }
36 return ans;
37 }
38
39 int main()
40 {
41 int T;
42 int kcase = 0;
43 scanf("%d", &T);
44 while(T --)
45 {
46 scanf("%d %d", &t, &d);
47 printf("Case %d: %.7lf\n", ++ kcase, solve());
48 }
49 return 0;
50 }