Cod sursa(job #2083136)

Utilizator karakter98Irimia Robert karakter98 Data 7 decembrie 2017 04:16:38
Problema Trapez Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <limits>
using namespace std;

FILE* fin;
FILE* fout;
int n;
float pante[1000000];

struct Point
{
    long long x;
    long long y;
} V[1000];

bool floatEqual(float a, float b)
{
    float epsilon = 1e-5;
    if(abs(a - b) < epsilon)
        return 1;
    return 0;
}

float computeGradient(Point a, Point b)
{
    if(a.x == b.x)
        return std::numeric_limits<float>::max();
    return (float)(a.y - b.y) / (a.x - b.x);
}

int main()
{
    fin = fopen("trapez.in", "r");
    fout = fopen("trapez.out", "w");
    fscanf(fin, "%d", &n);
    for(int i = 0; i < n; ++i)
        fscanf(fin, "%llu %llu", &V[i].x, &V[i].y);

    int k = 0;
    for(int i = 0; i < n - 1; ++i)
        for(int j = i + 1; j < n; ++j)
            pante[k++] = computeGradient(V[i], V[j]);

    sort(pante, pante + k);

    int nr = 0;
    int streak = 1;
    for(int i = 1; i < k; ++i)
    {
        if(floatEqual(pante[i], pante[i - 1]))
            ++streak;
        else
        {
            nr += (streak - 1) * streak / 2;
            streak = 1;
        }
    }
    nr += (streak - 1) * streak / 2;
    fprintf(fout, "%d", nr);
    return 0;
}