Codeforces 626D Jerry's Protest(暴力列舉+概率)

weixin_33896726發表於2017-06-29

D. Jerry's Protest

time limit per test:2 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output

Andrew and Jerry are playing a game with Harry as the scorekeeper. The game consists of three rounds. In each round, Andrew and Jerry draw randomly without replacement from a jar containing n balls, each labeled with a distinct positive integer. Without looking, they hand their balls to Harry, who awards the point to the player with the larger number and returns the balls to the jar. The winner of the game is the one who wins at least two of the three rounds.

Andrew wins rounds 1 and 2 while Jerry wins round 3, so Andrew wins the game. However, Jerry is unhappy with this system, claiming that he will often lose the match despite having the higher overall total. What is the probability that the sum of the three balls Jerry drew is strictly higher than the sum of the three balls Andrew drew?

Input

The first line of input contains a single integer n (2 ≤ n ≤ 2000) — the number of balls in the jar.

The second line contains n integers ai (1 ≤ ai ≤ 5000) — the number written on the ith ball. It is guaranteed that no two balls have the same number.

Output

Print a single real value — the probability that Jerry has a higher total, given that Andrew wins the first two rounds and Jerry wins the third. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if .

Examples
Input
2
1 2
Output
0.0000000000
Input
3
1 2 10
Output
0.0740740741
Note

In the first case, there are only two balls. In the first two rounds, Andrew must have drawn the 2 and Jerry must have drawn the 1, and vice versa in the final round. Thus, Andrew's sum is 5 and Jerry's sum is 4, so Jerry never has a higher total.

In the second case, each game could've had three outcomes — 10 - 2, 10 - 1, or 2 - 1. Jerry has a higher total if and only if Andrew won 2 - 1 in both of the first two rounds, and Jerry drew the 10 in the last round. This has probability .

題目連結:http://codeforces.com/contest/626/problem/D

題意:給定n個球以及每個球對應的分值a[],現在A和B進行三局比賽,每局比賽兩人隨機抽取一個球進行比拼,分值高的獲勝。現在A勝了兩局,B不服輸,因為他三局總分高於A。問發生的概率。

分析:首先分值最高為5000,可以考慮列舉分值求概率。假設B勝的那一局勝X分,A勝的兩局勝Y分,我們可以考慮列舉X或者Y。以列舉X來說要求X > Y,關鍵在於求出B一局勝分X概率Pb[X] 以及 A兩局勝分Y的概率Pa[Y]。

那麼直接暴力就好了,暴力前sort一下。對於第i個球a[i],勝分的球在j(1 <= j < i),把所有勝分求出並統計cnt[]。這樣對於一局比拼的勝分T,概率為cnt[T] / (n*(n-1)/2)。

求出一局的勝分,兩局也就好求了。對於A而言,兩局勝T分顯然概率為cnt[a] / (n*(n-1)/2) * cnt[b] / (n*(n-1)/2) 其中(a + b == T)。A兩局勝分T,可以O(a[max] * a[max])求出。

這題會爆int,所以。。。。。

 

下面給出AC程式碼:

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=5050;
 5 int n;
 6 double ans;
 7 ll cnt[N<<2],a[N<<2],b[N<<2];
 8 inline int read()
 9 {
10     int x=0,f=1;
11     char ch=getchar();
12     while(ch<'0'||ch>'9')
13     {
14         if(ch=='-')
15             f=-1;
16         ch=getchar();
17     }
18     while(ch>='0'&&ch<='9')
19     {
20         x=x*10+ch-'0';
21         ch=getchar();
22     }
23     return x*f;
24 }
25 int main()
26 {
27     n=read();
28     for(int i=1;i<=n;i++)
29         a[i]=read();
30     sort(a+1,a+1+n);
31     for(int i=1;i<=n;i++)
32     {
33         for(int j=n-1;j>=1;j--)
34         {
35             cnt[a[i]-a[j]]++;
36         }
37     }
38     ll sum=(n-1)*n/2;
39     for(int i=1;i<=5000;i++)
40     {
41         for(int j=1;j<=5000;j++)
42         {
43             b[i+j]+=1ll*cnt[i]*cnt[j];
44         }
45     }
46     for(int i=1;i<=5000;i++)
47     {
48         for(int j=i-1;j>=1;j--)
49         {
50             ans+=1.0*cnt[i]*b[j]/sum/sum/sum;
51         }
52     }
53     printf("%.10lf\n",ans);
54     return 0;
55 }

 

 

 

相關文章