题意:三局两胜,前两局A胜,第三局B胜,问最后B的得分总和大于A的可能性。
//总的事件个数为C(n,2)^3
//cnt[a] 赢的一局相差a时的方法数 cnt2[b],输的两局总和相差b的方法数 利用前缀和变为求出相差<=b的方法数
//则要求输掉前两局,赢第三局&&输的人总得分大(差距a-b>0)的方法数为: tot+=cnt2[i]*cnt[i+1] i=0~M-1
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
const int N=1e4+20;
const int M=5000;
int a[N];
ll cnt[N],cnt2[N];
//cnt[a] 赢的一局相差a时的方法数 cnt2[b],输的两局总和相差b的方法数 利用前缀和变为求出相差<=i的方法数
//则要求输掉前两局,赢第三局&&输的人总得分大(差距a-b>0): tot+=cnt2[i]*cnt[i+1] i=0~M
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
memset(cnt,0,sizeof(cnt));
memset(cnt2,0,sizeof(cnt2));
sort(a+1,a+1+n);
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
cnt[a[j]-a[i]]++;
}
}
for(int i=0;i<=M;i++)
{
for(int j=0;j<=M;j++)
{
cnt2[i+j]+=cnt[i]*cnt[j];//两局相差为i+j
}
}
for(int i=0;i<=M+M;i++)
{
cnt2[i]+=cnt2[i-1];//前缀和:两局相差小于i+j
}
double num=(n*(n-1))/2;
double space=num*num*num;//3局总的方法数
ll e=0;
for(int i=0;i<M;i++)
{
e+=cnt2[i]*cnt[i+1];
}
double ans=double(e/space);
printf("%.10lf\n",ans);
return 0;
}