您的位置:首页 > 其它

CodeForces 626D Jerry's Protest

2016-02-20 16:21 337 查看
计算前两盘A赢,最后一盘B赢的情况下,B获得的球的值总和大于A获得的球总和值的概率。

存储每一对球的差值有几个,然后处理一下前缀和,暴力枚举就好了......

#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;

const int maxn = 5000 + 10;
int n;
int a[maxn];
int b[maxn];
int sum[maxn];

int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
memset(sum, 0, sizeof sum);
memset(b, 0, sizeof b);
sort(a+1, a + n+1);
for (int i = 1; i <= n; i++)
for (int j = i + 1; j <= n; j++)
b[a[j] - a[i]]++;

double ans = 0;

for (int i = 1; i <= 5000; i++) sum[i] = sum[i - 1] + b[i];

for (int i = 0; i <= 5000; i++)
for (int j = 0; j <= 5000; j++)
{
if (i + j <= 5000)
ans = ans + 1.0*b[i] * b[j] * (sum[5000] - sum[i + j]);
}

//    printf("%d\n", ans);
double N = (double)n;
double f = N*(N - 1)*N*(N - 1)*N*(N - 1) / 8.0;
printf("%.6lf\n", 1.0*ans / f);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: