首页 > 代码库 > POJ 3716 Panda's Birthday Present 条件概率
POJ 3716 Panda's Birthday Present 条件概率
看了http://hi.baidu.com/bfcdygoporbjuxr/item/569897ddc1fc561d21e2503f 这个题解
感觉写的有点费劲 , 而且虽然写了一点关于公式(m+n+10)/7的,但我感觉还是不好理解啊。
不过其中讲的主要思路还是有用的。
对于一个骰子 有t个面为1的概率是 P(T=t)=C(6,t)/64。
在有t个面为1的情况下,投n次,有k个1,假设这k个1的位置已经固定了,则概率为 t ^ k * (6 - t) ^ (n - k) / 6 ^ n
则P (S) = sigma(t ^ k * (6 - t) ^ (n - k) / 6 ^ n * C(6,t)/64)(t = 0, 1. 2...6, S为01串,n的长度k个1)
对于任意一种有k个1的情况, 概率都是这个。也就是说 在计算上,这些情况都是等价的,可以互换的,
那么也就是说,第一次有m个1,第二次有n个1,对于任意的情况,只要满足第一次x个1,第二次y个1,x+y=m+n,x<=4 && y<=4, 就是等价的。
而在游戏中,对于一个骰子, 前两次的状态无非是 00, 01, 10, 11
然后我们要计算在这些状态下第3次投出1的概率
即P(1 | 00) P (1 | 01) P (1 | 10) P(1 | 11)
以 P (1 | 11)为例子
由条件概率 P( 1 | 11) = P (111) / P(11)
其中P(111)= sigma(t ^ 3/ 6^3 * C(6, t) /64 ) (t = 0,1,2...6)
P(11)= sigma(t ^ 2/ 6^2 * C(6, t) /64 ) (t = 0,1,2...6)
然后可以求出P(1 | 11) = 9 /14
同理P( 1 | 10) = 1 / 2
P( 1 | 00) = 5 /14
我们之前也知道了 任意情况只要满足 两次投的和等于m+n,求出的答案就跟原题是等价的
那么我们就找最简单的情况。
先满足11,然后满足10,剩余的满足00
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <queue> #include <cmath> #include <algorithm> #include <map> #include <ctime> #define MAXN 52222 #define MAXM 222222 #define INF 1000000001 using namespace std; double p11, p10, p00; int ct[] = {1, 6, 15, 20, 15, 6, 1}; int main() { double sum1 = 0, sum2 = 0; for(int i = 0; i <= 6; i++) sum1 += i * i * i * ct[i], sum2 += i * i * ct[i]; sum1 /= 216.0, sum2 /= 36.0; p11 = sum1 / sum2; sum1 = 0, sum2 = 0; for(int i = 0; i <= 6; i++) sum1 += i * i * (6 - i) * ct[i], sum2 += i * (6 - i) * ct[i]; sum1 /= 216.0, sum2 /= 36.0; p10 = sum1 / sum2; sum1 = 0, sum2 = 0; for(int i = 0; i <= 6; i++) sum1 += i * (6 - i) * (6 - i) * ct[i], sum2 += (6 - i) * (6 - i) * ct[i]; sum1 /= 216.0, sum2 /= 36.0; p00 = sum1 / sum2; int T, m, n; scanf("%d", &T); while(T--) { scanf("%d%d", &m, &n); int s = m + n; int num1 = s / 2; int num2 = s % 2; int num3 = 4 - num1 - num2; printf("%.3f\n", p11 * num1 + p10 * num2 + p00 * num3); } return 0; }
假设m+n是偶数。
那么最后答案即为 (m+n) / 2 * 9/14 + (4 - (m+ n) / 2) * 5 / 14 = (m + n + 10 ) / 7
假设m+n是偶数
最后答案为(m+n-1) /2 * 9/14 + 1/2 + (3 - (m+ n -1) / 2) * 5 /14 = (m + n+10) /7
最后发现不管怎么搞 答案都是(m + n + 10 ) / 7
POJ 3716 Panda's Birthday Present 条件概率