試合(long doubleとfixed)
2572 ワード
試合をする
(mat.pas/c/cpp)
【問題の説明】
二つのチームAとBがあり、それぞれのチームにはn人がいます.この2チームの間ではn試合1対1試合が行われ、それぞれAの中の1人の選手がBの中の1人の選手と対抗している.同じ人が複数の試合に参加することはなく、一人一人の相手はランダムで確率を待っている.例えばAチームがA 1とA 2の2人、BチームがB 1とB 2の2人であれば、(A 1 vs B 1,A 2 vs B 2)と(A 1 vs B 2,A 2 vs B 1)の確率はいずれも均等な50%である.
どの選手にも非負の実力値がある.実力値がXとYの選手が対抗すると、実力値の強い選手がいるチームは(X-Y)^2の得点を獲得します.
Aの得点を求めてBの得点の期待値を減らします.
【入力形式】
1行目の1つの数nは両チームの人数がnであることを示す.
2行目n個目、i個目A[i]はチームAのi番目の個人の実力値を表す.
3行目n個目、i個目B[i]はチームBのi番目の個人の実力値を表す.
【出力形式】
出力には、AがBに勝つことを望む実数が1つしか含まれていない.答えは小数点以下の1桁に残ります(精度に注意).
【サンプル入力】
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プレースホルダ
以下の形式で
(mat.pas/c/cpp)
【問題の説明】
二つのチームAとBがあり、それぞれのチームにはn人がいます.この2チームの間ではn試合1対1試合が行われ、それぞれAの中の1人の選手がBの中の1人の選手と対抗している.同じ人が複数の試合に参加することはなく、一人一人の相手はランダムで確率を待っている.例えばAチームがA 1とA 2の2人、BチームがB 1とB 2の2人であれば、(A 1 vs B 1,A 2 vs B 2)と(A 1 vs B 2,A 2 vs B 1)の確率はいずれも均等な50%である.
どの選手にも非負の実力値がある.実力値がXとYの選手が対抗すると、実力値の強い選手がいるチームは(X-Y)^2の得点を獲得します.
Aの得点を求めてBの得点の期待値を減らします.
【入力形式】
1行目の1つの数nは両チームの人数がnであることを示す.
2行目n個目、i個目A[i]はチームAのi番目の個人の実力値を表す.
3行目n個目、i個目B[i]はチームBのi番目の個人の実力値を表す.
【出力形式】
出力には、AがBに勝つことを望む実数が1つしか含まれていない.答えは小数点以下の1桁に残ります(精度に注意).
【サンプル入力】
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プレースホルダ
以下の形式で
cout.setf(ios::fixed);
cout.precision(1);
cout<<ans/n<<endl;
#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;
}