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 }
【版权声明】
本博客版权归作者和博客园共有,作品来自于长沙.NET技术社区成员【吴俊毅】,有兴趣了解长沙.NET技术社区详情,请关注公众号【DotNET技术圈】