Cod sursa(job #867301)

Utilizator Sanduleac_VladSanduleac Vllad Alexandru Sanduleac_Vlad Data 29 ianuarie 2013 15:34:46
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#define eps 1E-14
#define INF 1E30
using namespace std;

class Point {
    private:
    long x, y;
    public:
    Point() {x = y = 0;}
    Point(long a, long b) {x = a; y = b;}
    void set(long a, long b) {x = a; y = b;}
    double operator()(Point p) {
        double panta;
        if(x == p.x)
            panta = INF;
        else
            panta = ((double)p.y - y) / ((double)p.x - x);
        return panta;
    }
};

bool cmp(double d1, double d2) {
    return (d1 - d2) <= -eps;
}

long n;
Point p[1001];
vector<double> pante;
long total, momentan;
double pcrt;

int main() {
    long i, j, x, y;
    double pant;
    vector<double>::iterator it;
    freopen("trapez.in", "r", stdin);
    freopen("trapez.out", "w", stdout);
    scanf("%ld", &n);
    for(i = 1; i <= n; i++) {
        scanf("%ld%ld", &x, &y);
        p[i].set(x, y);
    }
    for(i = 1; i <= n; i++)
        for(j = i + 1; j <= n; j++) if(i != j) {
            pant = p[i](p[j]);
            pante.push_back(pant);
        }
    sort(pante.begin(), pante.end(), cmp);
    pcrt = pante[0];
    total = 0;
    momentan = 1;
    for(it = pante.begin() + 1; it != pante.end(); it++) {
        if(fabs(pcrt - *it) < eps)
            momentan++;
        else {
            pcrt = *it;
            total += (momentan * (momentan - 1)) / 2;
            momentan = 1;
        }
    }
    total += (momentan * (momentan - 1)) / 2;
    printf("%ld", total);
    return 0;
}