LightOj_1265 Island of Survival

题目链接

题意:

  在孤岛生存, 孤岛上有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 }
View Code

 

posted @ 2015-08-13 09:19  若羽。  阅读(237)  评论(0编辑  收藏  举报