Cod sursa(job #681715)

Utilizator milijrCristian Militaru milijr Data 17 februarie 2012 17:55:11
Problema Trapez Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <windows.h>
using namespace std;

//m ( x2 - x1 ) = y2 - y1
//m = 

class fractie
{
public:
	fractie(): numar(0), numi(0) {}
	fractie(int numarS, int numiS): numar(numarS), numi(numiS){}
	bool operator<(fractie f2) const
	{
		return (f2.numi * numar < f2.numar * numi); 
	}
	bool operator==(fractie f2)
	{
		return (f2.numi * numar == f2.numar * numi);
	}
	int numar,numi;
};

#define MAXN 105

int main()
{
	FILE *in  = fopen("trapez.in",  "r");
	FILE *out = fopen("trapez.out", "w");
	
	int i, j, n, x[MAXN], y[MAXN], npante = 0;
	fractie pante[(MAXN * MAXN - 1) / 2 + 100];
	
	fscanf(in, "%i", &n);
	for(i = 1; i <= n; i++)
	{
		fscanf(in, "%i %i", &x[i], &y[i]);
		for(j = 1; j < i; j++)
		{
			if(x[i] != x[j])
				pante[++npante] = fractie(y[j] - y[i], x[j] - x[i]);
		}
	}
	
	bool viz[(MAXN * (MAXN - 1)) / 2 + 100];
	int nraux = 0, nrFinal = 0;
	
	memset(viz, 0, sizeof(bool[(MAXN * (MAXN - 1)) / 2 + 100]));
	
	for(i = 1; i < npante; i++)
		if(viz[i] == 0)
		{
			nraux = 1;
			for(j = i + 1; j <= npante; j++)
			{
				if(pante[i] == pante[j])
				{
					viz[j] = 1;
					nraux++;
				}
			}
			nrFinal += nraux * (nraux - 1) / 2;
		}
	/*sort(pante + 1, pante + npante + 1);
	
	fractie curent(-1, -1);
	for(i = 1; i <= npante; i++)
		if(pante[i] == curent)
			nraux++;
		else
		{
			nrFinal += nraux * (nraux - 1) / 2;
			nraux = 1;
			curent = pante[i];
		}
	nrFinal += nraux * (nraux - 1) / 2;*/
	
	fprintf(out, "%i", nrFinal);
}