Cod sursa(job #196506)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 27 iunie 2008 00:46:08
Problema Adapost 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include<stdio.h>
#include<math.h>
//#include<conio.h>

#define NMAX 50001
struct pct{double x,y;};
pct v[NMAX];
int n;
double dist(double x,double y){
int i;
double rez=0.0,patr,rad,term;
for(i=0;i<n;++i){
	patr=(x-v[i].x)*(x-v[i].x)+(y-v[i].y)*(y-v[i].y);
	rad=sqrt(patr);
	term=rad;
	rez+=term;
	}
return rez;
}
double fx(double x,double y){
int i;
double rez=0.0,patr,rad,term;
for(i=0;i<n;++i){
	patr=(x-v[i].x)*(x-v[i].x)+(y-v[i].y)*(y-v[i].y);
	rad=sqrt(patr);
	if(rad) term=(x-v[i].x)/rad;
	else term=0.0;
	rez+=term;
	}
return rez;
}
double fy(double x,double y){
int i;
double rez=0.0,patr,rad,term;
for(i=0;i<n;++i){
	patr=(x-v[i].x)*(x-v[i].x)+(y-v[i].y)*(y-v[i].y);
	rad=sqrt(patr);
	if(rad) term=(y-v[i].y)/rad;
	else term=0.0;
	rez+=term;
	}
return rez;
}
double dfx(double x,double y){
int i;
double rez=0.0,patr,rad,term;
for(i=0;i<n;++i){
	patr=(x-v[i].x)*(x-v[i].x)+(y-v[i].y)*(y-v[i].y);
	rad=sqrt(patr);
	if(rad) term=(y-v[i].y)*(y-v[i].y)/rad/patr;
	else term=0.0;
	rez+=term;
	}
return rez;
}
double dfy(double x,double y){
int i;
double rez=0.0,patr,rad,term;
for(i=0;i<n;++i){
	patr=(x-v[i].x)*(x-v[i].x)+(y-v[i].y)*(y-v[i].y);
	rad=sqrt(patr);
	if(rad) term=(x-v[i].x)*(x-v[i].x)/rad/patr;
	else term=0.0;
	rez+=term;
	}
return rez;
}
double dfxy(double x,double y){
int i;
double rez=0.0,patr,rad,term;
for(i=0;i<n;++i){
	patr=(x-v[i].x)*(x-v[i].x)+(y-v[i].y)*(y-v[i].y);
	rad=sqrt(patr);
	if(rad) term=-(x-v[i].x)*(y-v[i].y)/rad/patr;
	else term=0.0;
	rez+=term;
	}
return rez;
}


int main(){
//clrscr();
freopen("adapost2.in","r",stdin);
freopen("adapost2.out","w",stdout);
scanf("%d",&n);
double sx=0.0,sy=0.0,xmed,ymed;
double xi,xs,yi,ys,x0,y0,ex,ey,xmij,ymij,mx,my;
ex=ey=0.1;
int i;
for(i=0;i<n;++i){
	scanf("%lf%lf",&v[i].x,&v[i].y);
	sx+=v[i].x;
	sy+=v[i].y;
	}
xmed=sx/n;ymed=sy/n;
xi=xmed;yi=ymed;
yi=1.0;
double _fx,_fy,_dfxy,_dfx,_dfy,delta,deltax,deltay,_dist;
/*do {
	_fy=fy(xi,yi);
	_dfy=dfy(xi,yi);
	_dist=dist(xi,yi);
	printf("%0.10lf %0.10lf %0.10lf %0.10lf\n",yi,_fy,_dfy,_dist);
	yi+=0.01;
	}while(yi<=3);   */
int nrp=0;
//yi=5.0;xi=6;
double dd=1,vfx,vfy,vdd,k=0.1;
	vdd=dist(xi,yi);
	vfx=fx(xi,yi);
	vfy=fy(xi,yi);
do{
  //	dd=dist(xi,yi)*k;
	_fx=fx(xi,yi);
	_fy=fy(xi,yi);
	//if(vfx<_fx||vfy<_fy) k=k*k;
	_dfxy=dfxy(xi,yi);
	_dfx=dfx(xi,yi);
	_dfy=dfy(xi,yi);
	delta=_dfx*_dfy-_dfxy*_dfxy;
	deltax=_dfy*(_fx-_dfx*xi-_dfxy*yi-dd)-_dfxy*(_fy-_dfxy*xi-_dfy*yi-dd);
	deltay=_dfx*(_fy-_dfxy*xi-_dfy*yi-dd)-_dfxy*(_fx-_dfx*xi-_dfxy*yi-dd);
	if(delta!=0){
		xs=-deltax/delta;
		ys=-deltay/delta;
		}
	else goto finish;
	mx=xs-xi;
	if(mx<0) mx=-mx;
	my=ys-yi;
	if(my<0) my=-my;
	nrp++;
	xi=xs;yi=ys;
	}while(mx>ex||my>ey);

finish:
//_dist=dist(xi,yi);
//_fx=fx(xi,yi);
//_fy=fy(xi,yi);
printf("%0.4lf %0.4lf\n",xi,yi);
//printf("%d\n",nrp);
//printf("%0.10lf %0.10lf\n",_fx,_fy);
//printf("\n%0.10lf %0.10lf",xmed,ymed);
return 0;
}