Cod sursa(job #3292246)

Utilizator r0b3rtUngureanu Robert Anton r0b3rt Data 7 aprilie 2025 18:16:21
Problema Cele mai apropiate puncte din plan Scor 30
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define min(a,b) ((a) < (b) ? (a) : (b))

struct punct
{
    double ordonata;
    double abscisa;
};

int compare(const void *A, const void *B)
{
    struct punct a=*((struct punct*)A);
    struct punct b=*((struct punct*)B);
    if(a.ordonata-b.ordonata)
        return (a.ordonata-b.ordonata);
    if(a.abscisa-b.abscisa)
        return (a.abscisa-b.abscisa);
}

double distanta(struct punct a, struct punct b)
{
    return sqrt((a.ordonata-b.ordonata)*(a.ordonata-b.ordonata)+(a.abscisa-b.abscisa)*(a.abscisa-b.abscisa));
}

double di(struct punct sir[], int i, int j)
{
    if(j==i)
        return __INT_MAX__;
    if(j-i==1)
        return distanta(sir[i], sir[j]);

    int m=i+(j-i)/2;
    double d=min(di(sir, i, m), di(sir, m+1, j));
    return d;
}

int main()
{
    FILE* in=fopen("cmap.in", "r"), *out=fopen("cmap.out" ,"w");
    int n;
    fscanf(in, "%d", &n);
    struct punct *sir=malloc(n*sizeof(struct punct));
    for(int i=0; i<n; i++)
    {
        fscanf(in, "%lf %lf", &sir[i].ordonata, &sir[i].abscisa);
    }
    qsort(sir, n, sizeof(struct punct), compare);
    double rez=di(sir, 0, n-1);
    fprintf(out, "%lf", rez);
    return 0;
}