Cod sursa(job #2314695)

Utilizator cameliapatileaPatilea Catalina Camelia cameliapatilea Data 8 ianuarie 2019 23:03:12
Problema Adapost 2 Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <math.h>
int n, i;
//setez coordonatele pe axe
int dx[] = {0, 1, 0, -1}, dy[] = {-1, 0, 1, 0};
double v[50005], w[50005], suma_x, suma_y, maxi=1000, distanta, distanta_minima, x_minim, y_minim;
double calculeaza_distanta( double x1, double y1, double x2, double y2)
{
    //calculez distanta dintre 2 puncte
    return sqrt( ( x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
}
double calcul( double x, double y)
{
    double suma = 0;
    for( int i = 1; i <=n; i++)
        suma= suma + calculeaza_distanta(x, y, v[i], w[i]);
    return suma;

}

int main() {

    FILE *f = fopen("adapost2.in", "r+");
    FILE *g = fopen("adapost2.out", "w+");

    fscanf(f, "%d", &n);

    for (i = 1; i <= n; i++) {

        fscanf(f, "%lf%lf", &v[i], &w[i]);

        //calculez suma tuturor coordonatelor de pe x, respectiv y
        suma_x = suma_x + v[i];
        suma_y = suma_y + w[i];

    }
//fac media si o trnsform in float
    suma_x = suma_x * 1.0 / n;
    suma_y = suma_y * 1.0 / n;
//calculez suma dintre distanta medie si fiecare coordonata in parte
    distanta = calcul(suma_x, suma_y);
    while (maxi > 0.001) {
        int ok = 0;
        for (i = 0; i < 4; i++) {
            //calculez pentru fiecare coordonata un x_minim/y_minim care este egal cu suma calculata la citire
            //adunat la maximul curent inmultit cu valoarea coordonatei pe care ne aflam
            x_minim = suma_x + maxi * dx[i];
            y_minim = suma_y + maxi * dy[i];
            distanta_minima = calcul(x_minim, y_minim);
            if (distanta_minima < distanta) {
                ok = 1;
                distanta = distanta_minima;
                suma_x = x_minim;
                suma_y = y_minim;
            }
        }
        //micsorez maximul
        if (ok == 0)
            maxi = maxi / 2;
    }
    fprintf(g, "%lf  %lf", suma_x, suma_y);
    return 0;
}