[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;
}