Cod sursa(job #406572)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 1 martie 2010 17:22:22
Problema Cele mai apropiate puncte din plan Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<iostream>
#include<fstream.h>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<math.h>

using namespace std;

ifstream fin("cmp.in");
ofstream fout("cmp.out");

struct point
{
	long long  x,y;
};

long long lin,col,n,stanga;
double rez1,rez2,rez3;
point punct;

vector<point> v;
vector<int>::iterator it;

long long i,min=2502500,rez;

double teta(point p1, point p2)
	{
		return sqrt((double)((long long)((long long)p1.x-p2.x)*(p1.x-p2.x)+(long long)((long long)p1.y-p2.y)*(p1.y-p2.y)));
	}



bool compare(point a, point b)
{
	return (b.x>a.x);
}


double Divide_and_Conquer(long long st, long long dr,long long n)
{   
	double minim=2481294;
	int i=0;
	int j=0;
	double dist;
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			if(st<=v[i].x && v[i].x<=dr && st<=v[j].x && v[j].x<=dr)
			{
				dist=teta(v[i],v[j]);
				if(dist<minim)
					minim=dist;
			}
	return minim;
}
	
long long end,mj,p=1000000;	
		
int main()

{	
	fin>>n;
	for(i=0;i<n;i++)
	{   
		fin>>punct.x>>punct.y;
		v.push_back(punct);
	}
	
	sort(v.begin(),v.end(),compare);
	for(i=0;i<n;i++)
		cout<<v[i].x<<' '<<v[i].y<<' '<<"\n";
	long long mj=(0+punct.x)/2;
	end=punct.x;
	rez1=Divide_and_Conquer(0,mj,n);
	rez2=Divide_and_Conquer(mj+1,end,n);
	cout<<rez1<<" "<<rez2;
	if(rez1<rez2)
		rez2=rez1;
	else
		rez1=rez2;
	
	rez3=Divide_and_Conquer(double(mj)-rez1,double(mj)+rez1,n);
	cout<<" "<<rez3;
	if(rez3<rez1)
		fout<<setprecision(6)<<rez3;
	else
		fout<<setprecision(6)<<rez1;

	return 0;
}