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+10)/7

假设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 条件概率

时间: 2024-08-06 01:10:06

POJ 3716 Panda's Birthday Present 条件概率的相关文章

POJ Ikki&#39;s Story IV - Panda&#39;s Trick [2-SAT]

题意: 圆上n个点,m对点之间连边,连在园内或园外,所有边不相交是否可行 发现两对点连线都在内相交则都在外也相交,那么只有一个在内一个在外啦,转化为$2-SAT$问题 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int N=1005,M=5e5; t

POJ 3207 Ikki&#39;s Story IV - Panda&#39;s Trick

简单的看了2-sat……似乎还是挺神奇的东西……等大致刷完几道题再来写总结吧! 而这道题……算是2-sat的超级入门题了吧 不过题目大意也是醉了:圆上顺序排列n个点,现要在一些点间连边,规定边只能在圆内或圆外,求有没有可能不相交 .一开始想的是嗷嗷嗷,圆上两个点的连线怎么可能有什么在圆外在圆内之分,不都是弦么?后来才知道……原来两个点的连线不是直线可以使曲线…… 判定是否相交很简单吧……看成是一条直线上四个点,那么如果e1.a<e2.a<e1.b<e2.b就相交啦…… 都说是热身题没多难

POJ 3207 Ikki&#39;s Story IV - Panda&#39;s Trick (2-SAT)

题目地址:POJ 3207 找好矛盾关系,矛盾关系是(2,5)和(3,6)这两个只能一个在外边,一个在里边,利用这个矛盾关系来建图. 可以用在外边和里边来当1和0,最后判断每对是否出现矛盾. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #inc

POJ 3207 Ikki&#39;s Story IV - Panda&#39;s Trick(2 - sat啊)

题目链接:http://poj.org/problem?id=3207 Description liympanda, one of Ikki's friend, likes playing games with Ikki. Today after minesweeping with Ikki and winning so many times, he is tired of such easy games and wants to play another game with Ikki. liy

【POJ】3207 Ikki&#39;s Story IV - Panda&#39;s Trick

http://poj.org/problem?id=3207 题意:一个圆上顺时针依次排列着标号为1-n的点,这些点之间共有m条边相连,每两个点只能在圆内或者圆外连边.问是否存在这些边不相交的方案.(n<=1000, m<=500) #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <iostream> using n

POJ 3207 Ikki&#39;s Story IV - Panda&#39;s Trick(2-sat)

POJ 3207 Ikki's Story IV - Panda's Trick 题目链接 题意:一个圆上顺序n个点,然后有m组连线,连接两点,要求这两点可以往圆内或圆外,问是否能构造出使得满足所有线段不相交 思路:2-sat,判断相交的建边,一个在内,一个在外,然后跑一下2-sat即可 代码: #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include

[2-SAT] poj 3207 Ikki&#39;s Story IV - Panda&#39;s Trick

题目链接: http://poj.org/problem?id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 8063   Accepted: 2969 Description liympanda, one of Ikki's friend, likes playing games with Ikki. Today after minesweep

[2-SAT] poj 3207 Ikki&amp;#39;s Story IV - Panda&amp;#39;s Trick

题目链接: http://poj.org/problem? id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 8063   Accepted: 2969 Description liympanda, one of Ikki's friend, likes playing games with Ikki. Today after mineswee

POJ 3207 Ikki&amp;#39;s Story IV - Panda&amp;#39;s Trick(2-sat)

POJ 3207 Ikki's Story IV - Panda's Trick id=3207" target="_blank" style="">题目链接 题意:一个圆上顺序n个点,然后有m组连线,连接两点,要求这两点能够往圆内或圆外.问能否构造出使得满足全部线段不相交 思路:2-sat,推断相交的建边,一个在内.一个在外,然后跑一下2-sat就可以 代码: #include <cstdio> #include <cstring