Cod sursa(job #1773963)

Utilizator enacheionutEnache Ionut enacheionut Data 8 octombrie 2016 13:38:03
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

struct Punct
{
    int x;
    int y;
};

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

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

    return puncte;
}

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

    return panta;
}

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

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

    return solutie;
}

int main()
{
    int numarPuncte;
    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;
}