Cod sursa(job #2073988)

Utilizator mihai.cosmin.pavelPavel Mihai Cosmin mihai.cosmin.pavel Data 23 noiembrie 2017 22:29:13
Problema Cele mai apropiate puncte din plan Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.89 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include <algorithm>
#include<bits/stdc++.h>

using namespace std;

bool sortbysec(const pair<int,int> &a, const pair<int,int> &b){
    return (a.second < b.second);
}

double distEuclid(pair<int, int> p1, pair<int, int> p2){
    return sqrt(pow(p1.first-p2.first,2) + pow(p1.second-p2.second,2));
}

void interclaseaza(vector< pair<int, int> > Y, int st, int mij, int dr){
    vector< pair<int, int> > Z;
    int i = st, j = mij+1;
    while (i <= mij && j <= dr){
        if (Y[i].second <= Y[j].second){
            Z.push_back(Y[i]);
            i++;
        }
        else{
            Z.push_back(Y[j]);
            j++;
        }
        while(i <= mij){
            Z.push_back(Y[i]);
            i++;
        }
        while(j <= dr){
            Z.push_back(Y[j]);
            j++;
        }
        for (int i=st; i<=dr; i++)
            Y[i] = Z[i-st];
    }
}

double DivImp(vector< pair<int, int> > X, vector< pair<int, int> > Y, int st, int dr){
    if (dr - st + 1 < 4){
        sort(Y.begin(), Y.end(), sortbysec);
        double minVal = distEuclid(X[st], X[dr]);
        for (int i=st; i<=dr-1; i++)
        for (int j=i+1; j<=dr; j++){
            if (distEuclid(X[i], X[j]) < minVal)
                minVal = distEuclid(X[i], X[j]);
        }
        return minVal;
    }
    else{
        int mij = (st + dr)/2;
        double d1 = DivImp(X, Y, st, mij);
        double d2 = DivImp(X, Y, mij+1, dr);
        double d = min(d1, d2);
        interclaseaza(Y, st, mij, dr);

        vector< pair<int, int> > LY;
        for (int i=st; i<=dr; i++){
            if (abs(Y[i].first - X[mij].first) <= d)
                LY.push_back(Y[i]);
        }

        int nr;
        double d3 = d;
        for (int i=0; i<LY.size()-1; i++){
            if (7 <= LY.size()-i)
                nr = 7;
            else nr = LY.size()-i;
            for (int j=1; j<=nr; j++){
                if(distEuclid(LY[i], LY[i+j]) < d3)
                    d3 = distEuclid(LY[i], LY[i+j]);
            }
        }
        return d3;
    }
}

int main()
{
    fstream InputFile;
    ofstream OutputFile;
    int n;
    pair<int, int> p;
    vector< pair<int, int> > X;
    vector< pair<int, int> > Y;

    InputFile.open("cmap.in");
    if (InputFile.is_open()){
        InputFile >> n;
        for (int i=0; i<n; i++){
            InputFile >> p.first;
            InputFile >> p.second;
            X.push_back(p);
        }
        InputFile.close();
    }
    else cout << "The input file could not be opened.";

    sort(X.begin(), X.end());
    //Y = X;
    for (int i=0; i<X.size(); i++){
        Y.push_back(X[i]);
        cout << Y[i].first << " " << Y[i].second << endl;
    }

    OutputFile.open("cmap.out");
    OutputFile << DivImp(X, Y, 0, n-1);
    return 0;
}