1. 程式人生 > >JZOJ 3055. 【NOIP2012模擬10.27】比賽

JZOJ 3055. 【NOIP2012模擬10.27】比賽

hint main 概率 如果 clear con 進行 scrip 參加

題目

Description


有兩個隊伍AB,每個隊伍都有n個人。這兩支隊伍之間進行n11比賽,每一場都是由A中的一個選手與B中的一個選手對抗。同一個人不會參加多場比賽,每個人的對手都是隨機而等概率的。例如A隊有A1A2兩個人,B隊有B1B2兩個人,那麽(A1 vs B1,A2 vs B2)(A1 vs B2,A2 vs B1)的概率都是均等的50%


每個選手都有一個非負的實力值。如果實力值為XY的選手對抗,那麽實力值較強的選手所在的隊伍將會獲得(X-Y)^2的得分。


A的得分減B的得分的期望值。



Input


第一行一個數n表示兩隊的人數為n


第二行n個數,第i個數A[i]表示隊伍A的第i個人的實力值。


第三行n個數,第i個數B[i]表示隊伍B的第i個人的實力值。




Output


輸出僅包含一個實數表示A期望贏B多少分。答案保留到小數點後一位(註意精度)。



Sample Input

2
3 7
1 5

Sample Output

20.0

Data Constraint

Hint


對於30%的數據,n50


對於100%.,n50000;A[i],B[i]50000

分析

利用公式算出每個人的期望

顯然任意兩個人相遇的概率是相等的,=兩人第一場相遇的概率+兩人第一場不相遇的概率*兩人第二場相遇的概率+……。

代碼

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace
std; 5 long long a[100001],b[101001],sum[100001],summ[100001]; 6 long long ans=0,cs; 7 int n; 8 int main () 9 { 10 11 cin>>n; 12 for (int i=1;i<=n;i++) 13 cin>>a[i]; 14 for (int i=1;i<=n;i++) 15 cin>>b[i]; 16 sort(a+1,a+1+n); 17 sort(b+1,b+1+n); 18 for (int i=1;i<=n;i++) 19 { 20 sum[i]=sum[i-1]+b[i]; 21 summ[i]=summ[i-1]+b[i]*b[i]; 22 } 23 long long j=0; 24 for (int i=1;i<=n;i++) 25 { 26 while (a[i]>b[j]&&j<=n) j++; 27 ans+=(j-1)*a[i]*a[i]-2*a[i]*sum[j-1]+summ[j-1]; 28 ans-=((n-j+1)*a[i]*a[i]-2*a[i]*(sum[n]-sum[j-1])+summ[n]-summ[j-1]); 29 } 30 double s=(double)(ans)/(double)(n); 31 printf("%.1f",s); 32 }

JZOJ 3055. 【NOIP2012模擬10.27】比賽