試合(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プレースホルダ
以下の形式で
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;
}