[CF626D] Jerry's Protest

[CF626D] Jerry's Protest - 概率dp

Description

有 N 个球,球上的数字大小都不相同,共进行三回合,每一回合两个人同时各自从袋子里拿出一个球然后放回。求前两个回合 A 拿出的球的数字大于 B,但是三个回合加起来的数字的和 B 大于 A 的概率。

Solution

对一回合,计算出每种分差的概率

对 1,2 计算出每种分差总和的概率

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

#define int long long

const int N = 20005;
const int O = 10002;

int n, a[N];
double p[N], q[N], ans;

signed main()
{
    ios::sync_with_stdio(false);
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (i != j)
                p[a[i] - a[j] + O] += 1.0 / n / (n - 1);
    for (int i = 1; i < O; i++)
        for (int j = 1; j < O; j++)
            if (-O <= i + j && i + j <= O)
                q[i + j + O] += p[i + O] * p[j + O];
    for (int i = 0; i <= O; i++)
        for (int j = -O; j <= 0; j++)
            if (-j > i)
                ans += q[i + O] * p[j + O];

    cout << fixed << setprecision(10) << ans * 8;
}
原文地址:https://www.cnblogs.com/mollnn/p/14418082.html