[CF540D] Bad Luck Island

[CF540D] Bad Luck Island - 概率

Description

给三种人,分别是r,s,p个,在孤岛上,每两个不同种人相遇则互吃,r吃s,s吃p,p吃r。求最后留下单一种族的概率。

Solution

考虑 (f[i][j][k]) 表示剩下 i 个 r,j 个 s,k 个 p 的概率(注意这里对概率的理解,此时样本空间为 i+j+k=C 的所有事件)

转移就是随机抽两个不同人种出来打一架

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

#define int long long

int r, s, p;

double f[105][105][105];

signed main()
{
    ios::sync_with_stdio(false);

    cin >> r >> s >> p;

    f[r][s][p] = 1;

    double ar = 0, as = 0, ap = 0;

    for (int i = r; i >= 0; i--)
    {
        for (int j = s; j >= 0; j--)
        {
            for (int k = p; k >= 0; k--)
            {
                if (i && j)
                    f[i][j - 1][k] += f[i][j][k] * i * j / (i * j + j * k + k * i);
                if (j && k)
                    f[i][j][k - 1] += f[i][j][k] * j * k / (i * j + j * k + k * i);
                if (k && i)
                    f[i - 1][j][k] += f[i][j][k] * k * i / (i * j + j * k + k * i);
                if (i && !j && !k)
                    ar += f[i][0][0];
                if (!i && j && !k)
                    as += f[0][j][0];
                if (!i && !j && k)
                    ap += f[0][0][k];
            }
        }
    }

    cout << fixed << setprecision(10) << ar << " " << as << " " << ap << endl;
}
原文地址:https://www.cnblogs.com/mollnn/p/14470195.html