Cod sursa(job #2180860)

Utilizator ioanavasilescuIoana Vasilescu ioanavasilescu Data 21 martie 2018 11:34:53
Problema Cele mai apropiate puncte din plan Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>

#define lim 100010

using namespace std;

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

double maxLength;

struct punct
{
    int x,y;
}Y[lim];

bool sortCondition(punct i,punct j)
{
    if(i.x<j.x) return 1;
    if(i.x==j.x && i.y<j.y) return 1;
    return 0;
}

void check(int n)
{
    for(int i=1;i<=n;i++)
        cout<<Y[i].x<<" "<<Y[i].y<<"\n";
    cout<<"\n";
}

double cmap(int i,int n)
{
    if(n<=3)
    {
        double distMin=maxLength,dist=0;
        for(int k=0;k<n;k++)
        {
            for(int l=k+1;l<n;l++)
            {
                dist=sqrt((Y[i+k].x-Y[i+l].x)*(Y[i+k].x-Y[i+l].x)+(Y[i+k].y-Y[i+l].y)*(Y[i+k].y-Y[i+l].y));
                if(dist<distMin)distMin=dist;
            }
        }
        return distMin;
    }
    double dist1=cmap(i,n/2),dist2=cmap(i+n/2,n/2);
    double distDiv=min(dist1,dist2);
    int zs=n/2,zd=n/2;
    while(Y[n/2].x-Y[zs].x<=distDiv)
        zs--;
    while(Y[zd].x-Y[n/2].x<=distDiv)
        zd--;
    for(int i=zs;i<=zd;i++)
    {
        double dist=0;
        for(int k=1;k<8;k++)
        {
            dist=sqrt((Y[i+k].x-Y[i].x)*(Y[i+k].x-Y[i].x)+(Y[i+k].y-Y[i].y)*(Y[i+k].y-Y[i].y));
            if(dist<distDiv)distDiv=dist;
        }
    }
    return distDiv;
}

int main()
{
    int n;
    int xmax=0,ymax=0;
    fin>>n;
    for(int i=1;i<=n;i++)
    {
        fin>>Y[i].x>>Y[i].y;
        if(Y[i].x>xmax)xmax=Y[i].x;
        if(Y[i].y>ymax)ymax=Y[i].y;
    }
    check(n);
    sort(Y,Y+n,sortCondition);
    check(n);
    maxLength=sqrt(xmax*xmax+ymax*ymax);
    fout<<cmap(1,n)<<"\n";
    return 0;
}