洛谷题单指南-概率与统计-UVA11181 条件概率 Probability|Given

原题链接:https://www.luogu.com.cn/problem/UVA11181

题意解读:n个人每个人买到东西概率不同,第i个买到的概率是pi,已知r人买到了东西,求此条件下每个人买到东西的概率。

解题思路:

设第i个人买到东西的事件为Ai,r个人买到东西事件为B

要求P(Ai | B),根据条件概率公式可知:

P(Ai | B) = P(Ai ∩ B) / P(B)

P(B)是r个人买到东西的概率,可以通过二进制枚举所有状态,对于恰好r个人买到东西的情况,计算概率(买到东西人乘pi,没买到的乘(1-pi))累加到P(B)。

P(Ai ∩ B) 是在Ai买到的情况下,另外r-1个人买到东西的概率,也可以通过二进制枚举所有状态,当恰好r-1个人买到的情况并且不包含第i个人,计算概率累加到P(Ai ∩ B) 。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 25;
double p[N], pab[N], pb;
int n, r;

int main()
{
    int t = 0;
    while(cin >> n >> r)
    {
        if(n == 0 && r == 0) break;
        pb = 0;
        memset(pab, 0, sizeof(pab));
        for(int i = 0; i < n; i++) cin >> p[i];

        for(int i = 0; i < 1 << n; i++)
        {
            int cnt = 0;
            double pt = 1.0;
            for(int j = 0; j < n; j++)
            {
                if(i >> j & 1) cnt++, pt *= p[j];
                else pt *= (1.0 - p[j]);
            }
            if(cnt == r - 1)
            {
                for(int j = 0; j < n; j++)
                {
                    if(i >> j & 1) continue;
                    pab[j] += p[j] * pt / (1 - p[j]); //pt是买到r-1个的概率,pab[j]是买第j个且买到其他r-1个的概率
                }
            }
            if(cnt == r) pb += pt;
        }

        printf("Case %d:\n", ++t);
        for(int i = 0; i < n; i++) printf("%.6lf\n", pab[i] / pb);
    }
}

 

posted @ 2026-01-07 15:54  hackerchef  阅读(2)  评论(0)    收藏  举报