Cod sursa(job #1968197)

Utilizator TincaMateiTinca Matei TincaMatei Data 17 aprilie 2017 15:40:07
Problema Adapost 2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cmath>

typedef double f64;
const int MAX_N = 50000;
const f64 EPS = 1e-5f;
f64 x[MAX_N], y[MAX_N];

inline f64 calc(f64 xP, f64 yP, int n) {
  f64 s = 0.0f;
  for(int i = 0; i < n; ++i)
    s = s + sqrt((xP - x[i]) * (xP - x[i]) + (yP - y[i]) * (yP - y[i]));
  return s;
}

int main() {
  int n;
  srand(time(NULL));
  FILE *fin = fopen("adapost2.in", "r");
  fscanf(fin, "%d", &n);
  for(int i = 0; i < n; ++i) {
    fscanf(fin, "%lf%lf", &x[i], &y[i]);
    printf("%f %f\n", x[i], y[i]);
  }
  fclose(fin);

  printf("%f\n", calc(4.1442f, 4.2898f, n));
  //printf("%f\n", calc(4.140197f, 4.272460f, n));


  f64 pas = 250.0f;
  f64 x = 500.0f;
  f64 y = 500.0f;
  while(pas > EPS) {
    f64 xdelta = (calc(x + EPS, y, n) - calc(x, y, n)) / EPS;
    f64 ydelta = (calc(x, y + EPS, n) - calc(x, y, n)) / EPS;
    if(xdelta < 0.0f)
      x = x + pas;
    else
      x = x - pas;

    if(ydelta < 0.0f)
      y = y + pas;
    else
      y = y - pas;
    pas = pas * 4.0f / 5.0f;
  }

  FILE *fout = fopen("adapost2.out", "w");
  fprintf(fout, "%f %f", x, y);
  fclose(fout);
  return 0;
}