Cod sursa(job #2069560)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 18 noiembrie 2017 16:10:16
Problema Adapost 2 Scor 7
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
int n;
struct Punct{float abs,ord;};
vector<Punct> v;
float distanta(float Abs1,float Ord1,float Abs2,float Ord2)
{
    return sqrt((Abs1-Abs2)*(Abs1-Abs2)+(Ord1-Ord2)*(Ord1-Ord2));
}
float Suma(float Abs,float Ord)
{
    int i;float sum=0;
    for(i=0;i<n;++i)
        sum+=distanta(Abs,Ord,v[i].abs,v[i].ord);
    return sum;
}
void CautBin(float SumAbs,float SumOrd,float &RezAbs,float &RezOrd)
{
    float Pas=1000;float Abs=SumAbs,Ord=SumOrd;RezAbs=Abs,RezOrd=Ord;
    Pas=min(Pas,SumAbs);Pas=min(Pas,SumOrd);Pas=min(Pas,1000-SumOrd);Pas=min(Pas,1000-SumAbs);
    float PrevFct=Suma(Abs,Ord),NewFct;
    while(Pas>0.001)
        {
            NewFct=Suma(Abs+Pas,Ord+Pas);
            if(NewFct<PrevFct) {RezAbs=Abs+=Pas;RezOrd=Ord+=Pas;PrevFct=NewFct;continue;}
            NewFct=Suma(Abs+Pas,Ord-Pas);
            if(NewFct<PrevFct) {RezAbs=Abs+=Pas;RezOrd=Ord+=Pas;PrevFct=NewFct;continue;}
            NewFct=Suma(Abs-Pas,Ord+Pas);
            if(NewFct<PrevFct) {RezAbs=Abs-=Pas;RezOrd=Ord+=Pas;PrevFct=NewFct;continue;}
            NewFct=Suma(Abs-Pas,Ord-Pas);
            if(NewFct<PrevFct) {RezAbs=Abs-=Pas;RezOrd=Ord-=Pas;PrevFct=NewFct;continue;}
            Pas/=2;
        }
}
int main()
{
    ifstream f("adapost2.in");
    ofstream g("adapost2.out");
    f>>n;v.resize(n);float SumAbs=0,SumOrd=0;
    int i;
    for(i=0;i<n;i++)
        {f>>v[i].abs>>v[i].ord;SumAbs+=v[i].abs;SumOrd+=v[i].ord;}
    SumAbs/=n;SumOrd/=n;float x=0,y=0;
    CautBin(SumAbs,SumOrd,x,y);
    g<<x<<' '<<y<<'\n';
    return 0;
}