Pagini recente » Cod sursa (job #2601719) | Cod sursa (job #2336840) | Cod sursa (job #42219) | Cod sursa (job #454181) | Cod sursa (job #1364037)
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
//cele mai apropiate puncte in plan
using namespace std;
double inf = 10000000000000000;
inline double sqr(double x)
{
return x*x;
}
struct punct{
double x, y;
};
int n;
double min_dist(punct *A, int left, int right) {
if(left == right) return inf;
if(left+1 == right) return sqr(A[left].x - A[right].x) + sqr(A[left].y - A[right].y);
int mid = (left+right)/2;
double dist1 = min(min_dist(A, left, mid), min_dist(A, mid, right));
int s, d;
s = max(1, mid-7); d = min(mid+7, n);
double dist2 = sqr(A[s].x - A[d].x) + sqr(A[s].y - A[d].y);
for(int i = s; i <= d; i++){
for(int j = i+1; j <= d; j++){
if( sqr(A[i].x - A[j].x) + sqr(A[i].y - A[j].y) < dist2 ) {
dist2 = sqr(A[i].x - A[j].x) + sqr(A[i].y - A[j].y);
}
}
}
return min(dist1, dist2);
}
bool cmp(punct q, punct w)
{
return q.x <= w.x;
}
int main()
{
ifstream inFile("cmap.in");
ofstream outFile("cmap.out");
inFile >> n;
punct A[100004];
double x, y;
punct p;
for(int i = 1; i <= n; i++) {
inFile >> x >> y;
p.x = x;
p.y = y;
A[i] = p;
}
sort(A+1, A+1+n, cmp);
for(int i = 1; i <= n; i++) {
outFile << A[i].x << " " << A[i].y << "\n";
}
outFile << sqrt(min_dist(A, 1, n));
}