Cod sursa(job #2069741)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 18 noiembrie 2017 19:38:35
Problema Adapost 2 Scor 12
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 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;
    float Abs=SumAbs,Ord=SumOrd;
    RezAbs=Abs,RezOrd=Ord;
    Pas=1000.0;
    float PrevFct=Suma(Abs,Ord),NewFct;
    while(Pas>=0.000001)
    {
        if(Abs+Pas<=1000.0 && Ord+Pas<=1000.0)
        {
            NewFct=Suma(Abs+Pas,Ord+Pas);
            if(NewFct<=PrevFct)
            {
                RezAbs=Abs+=Pas;
                RezOrd=Ord+=Pas;
                PrevFct=NewFct;
            }
        }
        if(Abs+Pas<=1000.0 && Ord-Pas>=0.0)
        {
            NewFct=Suma(Abs+Pas,Ord-Pas);
            if(NewFct<=PrevFct)
            {
                RezAbs=Abs+=Pas;
                RezOrd=Ord+=Pas;
                PrevFct=NewFct;
            }
        }
        if(Abs-Pas>=0.0 && Ord+Pas<=1000.0)
        {
            NewFct=Suma(Abs-Pas,Ord+Pas);
            if(NewFct<=PrevFct)
            {
                RezAbs=Abs-=Pas;
                RezOrd=Ord+=Pas;
                PrevFct=NewFct;
            }
        }
        if(Abs-Pas>=0.0 && Ord-Pas>=0.0)
        {
            NewFct=Suma(Abs-Pas,Ord-Pas);
            if(NewFct<=PrevFct)
            {
                RezAbs=Abs-=Pas;
                RezOrd=Ord-=Pas;
                PrevFct=NewFct;
            }
        }
        Pas*=0.6;
    }
}
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;
}