Pagini recente » Cod sursa (job #478357) | Cod sursa (job #175156) | Cod sursa (job #1703027) | Cod sursa (job #48410) | Cod sursa (job #2314695)
#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;
}