比賽
(mat.pas/c/cpp)
【問題描述】
有兩個隊伍A和B,每個隊伍都有n個人。這兩支隊伍之間進行n場1對1比賽,每一場都是由A中的一個選手與B中的一個選手對抗。同一個人不會參加多場比賽,每個人的對手都是隨機而等概率的。例如A隊有A1和A2兩個人,B隊有B1和B2兩個人,那麼(A1 vs B1,A2 vs B2)和(A1 vs B2,A2 vsB1)的概率都是均等的50%。
每個選手都有一個非負的實力值。如果實力值為X和Y的選手對抗,那麼實力值較強的選手所在的隊伍將會獲得(X-Y)^2的得分。
求A的得分減B的得分的期望值。
【輸入格式】
第一行一個數n表示兩隊的人數為n。
第二行n個數,第i個數A[i]表示隊伍A的第i個人的實力值。
第三行n個數,第i個數B[i]表示隊伍B的第i個人的實力值。
【輸出格式】
輸出僅包含一個實數表示A期望贏B多少分。答案保留到小數點後一位(注意精度)。
【樣例輸入】
2
37
15
【樣例輸出】
20.0
【數據規模】
對於30%的數據,n≤50。
對於100%的.據,n≤50000;A[i],B[i]≤50000。
∑(a[i]-b[i))^2
注意後綴數要在排序後T_Y
另外C++要用long double ---但是不能用.lf占位符
要用如下的格式
[cpp]
cout.setf(ios::fixed);
cout.precision(1);
cout<<ans/n<<endl;
[cpp]
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cctype>
#include<functional>
#include<algorithm>
#include<iostream>
using namespace std;
#define MAXN (50000+10)
long long n,a[MAXN],b[MAXN],sumb[MAXN],sumb2[MAXN];
int main()
{
freopen("mat.in","r",stdin);
freopen("mat.out","w",stdout);
scanf("%d",&n);
sumb[0]=sumb2[0]=0;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
for (int i=1;i<=n;i++)
{
cin>>b[i];
}
sort(b+1,b+1+n);
for (int i=1;i<=n;i++)
{
sumb[i]=sumb[i-1]+b[i];
sumb2[i]=sumb2[i-1]+b[i]*b[i];
}
long double ans=0.0;
for (int i=1;i<=n;i++) cout<<sumb[i]<<' ';
cout<<endl;
int r=0;
for (int i=1;i<=n;i++)
{
while (r<n&&a[i]>b[r+1]) r++;
ans+=a[i]*a[i]*(2*r-n);
ans+=2*sumb2[r]-sumb2[n];
ans-=2*a[i]*(2*sumb[r]-sumb[n]);
/*
long double tmp=0.0;
//cout<<r<<endl;
tmp+=r*a[i]*a[i]-2*a[i]*sumb[r]+sumb2[r];
cout<<tmp<<endl;
tmp-=(n-r)*a[i]*a[i]-2*a[i]*(sumb[n]-sumb[r])+sumb2[n]-sumb2[r];
tmp/=n;
ans+=tmp;
// cout<<ans;
*/
}
// cout<<ans<<endl;
cout.setf(ios::fixed);
cout.precision(1);
cout<<ans/n<<endl;
// while (1);
return 0;
}