Cod sursa(job #1773972)

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

using namespace std;

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

    vector<pair<int, int>> puncte(numarPuncte + 1);
    for( auto &punct : puncte )
    {
        in>> punct.first>> punct.second;
    }
    in.close();

    return puncte;
}

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

    return panta;
}

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

    for( int i = 1; i <= dimensiuneVectorPanta; ++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;
}