Cod sursa(job #1773959)

Utilizator enacheionutEnache Ionut enacheionut Data 8 octombrie 2016 13:35:56
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

struct Punct
{
    unsigned int x;
    unsigned int y;
};

vector<Punct> CitireInput(unsigned int &numarPuncte)
{
    ifstream in("trapez.in");
    in>> numarPuncte;

    vector<Punct> puncte(numarPuncte + 1);
    for( unsigned int i = 1; i <= numarPuncte; ++i )
    {
        in>> puncte[i].x>> puncte[i].y;
    }
    in.close();

    return puncte;
}

vector<double> CalcularePanta(vector<Punct> puncte, unsigned int numarPuncte,
                              unsigned int &dimensiuneVectorPanta)
{
    vector<double> panta(numarPuncte * numarPuncte + 1);
    for( unsigned int i = 1 ;i < numarPuncte - 1; ++i )
    {
        for( unsigned int j = i + 1; j <= numarPuncte; ++j )
        {
            panta[++dimensiuneVectorPanta] = (double) (puncte[i].x - puncte[j].x) /
                (puncte[i].y - puncte[j].y);
        }
    }

    return panta;
}

unsigned int CalculeazaNumarulTrapezelor(vector<double> panta, unsigned int dimensiuneVectorPanta)
{
    unsigned int solutie = 0;
    unsigned int nr = 0;

    for( unsigned int i = 1; i <= dimensiuneVectorPanta + 1; ++i )
    {
        panta[i] != panta[i-1] ? solutie += (nr * (nr-1) / 2), nr = 1 : ++nr;
    }

    return solutie;
}

int main()
{
    unsigned int numarPuncte;
    unsigned int dimensiuneVectorPanta = 0;

    auto puncte = CitireInput(numarPuncte);
    auto panta = CalcularePanta(puncte, numarPuncte, dimensiuneVectorPanta);

    sort(panta.begin(), panta.begin() + dimensiuneVectorPanta + 1);

    ofstream out("trapez.out");
    out<< CalculeazaNumarulTrapezelor(panta, dimensiuneVectorPanta);
    out.close();

    return 0;
}