Cod sursa(job #326313)

Utilizator AndreyPAndrei Poenaru AndreyP Data 24 iunie 2009 16:15:50
Problema Adapost 2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>
#include<math.h>
#include<utility>
using namespace std;
#define fs first
#define sc second
#define mp make_pair
#define pdd pair<double,double>
#define N 50010
const double eps=1e-10;
int n;
pdd v[N],rez;
inline double modul(double x)
{
	if(x<0)
		return -x;
	return x;
}
inline double dist(pdd &x,pdd &y)
{
	return sqrt((x.fs-y.fs)*(x.fs-y.fs)+(x.sc-y.sc)*(x.sc-y.sc));
}
int main()
{
	freopen("adapost2.in","r",stdin);
	freopen("adapost2.out","w",stdout);
	scanf("%d",&n);
	pdd p;
	for(int i=0; i<n; ++i)
	{
		scanf("%lf%lf",&v[i].fs,&v[i].sc);
		rez.fs+=v[i].fs;
		rez.sc+=v[i].sc;
	}
	rez.fs/=(double)n;
	rez.sc/=(double)n;	
	double dacu=0.0,d=0.0;
	for(int i=0; i<n; ++i)
		dacu+=dist(rez,v[i]);
	while(modul(dacu-d)>eps)
	{
		d=dacu;
		p=rez;
		rez.fs=rez.sc=0;
		double aux=0;
		for(int i=0; i<n; ++i)
		{
			dacu=dist(p,v[i]);
			rez.fs+=v[i].fs/dacu;
			rez.sc+=v[i].sc/dacu;
			aux+=(1.0/dacu);
		}
		rez.fs/=aux;
		rez.sc/=aux;
		dacu=0;
		for(int i=0; i<n; ++i)
			dacu+=dist(rez,v[i]);
	}
	printf("%lf %lf\n",rez.fs,rez.sc);
	return 0;
}