Cod sursa(job #146518)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 1 martie 2008 20:48:05
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define maxn 1024
#define epsilon 0.00000000001

long x[maxn], y[maxn];
long double v[maxn * maxn];

int cmp(const void *a, const void *b) {
	if ((*(long double *)a - *(long double *) b) > 0) {
		return 1;
	}
	return -1;
}

long double panta(long a, long b) {
	long xx, yy;
	xx = y[b] - y[a];
	yy = x[a] - x[b];
	if (yy == 0) return 723.35;
	return (long double) xx / yy;

}
long aprox(long double a, long double b) {
	if (a >= b && a - b < epsilon || b >= a && b - a < epsilon) 
		return 1;
	return 0;
}

int main() {
	freopen("trapez.in","rt",stdin);
	freopen("trapez.out","wt",stdout);
	
	long n, s = 0, i, j, nr = 0, m;
	scanf("%ld", &n);
	for(i = 1;i <= n; ++i) {
		scanf("%ld %ld", &x[i], &y[i]);
	}
	for(i = 1;i <= n; ++i)
		for(j = i + 1;j <= n;++j)
			v[++nr] = panta(i, j);
	
	qsort(v + 1, nr, sizeof(v[0]), cmp);
	v[0]= - 4354;
	m = 1;
	for(i = 1;i <= nr; ++i) {
		if (aprox(v[i], v[i - 1])) {
			++m;
		}
		else {
			s += m * (m - 1) / 2;
			m = 1;
		}
	}
	printf("%ld\n", s);
	return 0;
}