Cod sursa(job #2619482)

Utilizator ADRIAN.CATRINOIUAdrian Catrinoiu ADRIAN.CATRINOIU Data 27 mai 2020 19:31:17
Problema Trapez Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("trapez.in");
ofstream fout("trapez.out");

struct puncte
{
    double x,y;
}v[1005];
//functie care calculeaza panta a liniei dintre 2 puncte
float panta(float x1, float y1, float x2, float y2)
{
    return (y2 - y1) / (x2 - x1);
}
int main()
{
    int n,i,j,m;
    double pante[1000005];
    fin>>n;
    //citim punctele
    for(i=1;i<=n;i++)
    {
        fin>>v[i].x>>v[i].y;
    }
    //vom folosi panta fiecarei linii pentru a verifica daca doua linii sunt paralele
    int nr_pante=0;
    for(i=1;i<n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            nr_pante++;
            if(v[j].x==v[i].x)
                {
                    pante[nr_pante]=INT_MAX;
                }
            else
            {
                pante[nr_pante]=panta(v[i].x,v[i].y,v[j].x,v[j].y);
            }

        }
    }
   /* fout<<'\n';
    for(i=1;i<nr_pante;i++)
        fout<<pante[i]<<'\n';*/
    //sortam vectorul pentru a-l parcurge si vedea cate pante consecutive sunt egale
    sort(pante+1,pante+nr_pante+1);
/*        fout<<'\n';

for(i=1;i<nr_pante;i++)
        fout<<pante[i]<<'\n';*/
    int trapez=0;
    j=1;
    for(i=1;i<nr_pante;i++)
    {
        //daca doua pante sunt egale atunci crestem numarul de trapeze posibile
        if(pante[i]==pante[i-1])
            j++;
        else
        {
            //daca avem mai mult de 1 trapez care se poate face cu 2 linii il adaugam
            trapez+=(j*(j-1))/2;
            //reinitializam nr de trapeze posibile la 0 pentru a continua
            j=1;
        }


    }

    trapez+=(j*(j-1))/2;
    fout<<trapez;
    return 0;
}