Cod sursa(job #1337370)

Utilizator livliviLivia Magureanu livlivi Data 8 februarie 2015 22:09:33
Problema Trapez Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<cstdio>
#include<algorithm>
#define MAX 1000
using namespace std;

struct mazi{
    int numi,numa;

    bool operator < (mazi a){
        if (this-> numa<a.numa) return true;
        if (this-> numa==a.numa &&this-> numi<a.numi) return true;
        return false;
    }

    bool operator == (mazi a){
        if (this-> numa==a.numa &&this-> numi==a.numi) return true;
        return false;
    }
};

int cmmdc(int a,int b){
    int r;

    while(a!=0){
        r=b%a;
        b=a;
        a=r;
    }

    return b;
}

bool meow(mazi a,mazi b){
    if (a<b) return true;
    return false;
}

mazi v[MAX*MAX+1];
int x[MAX+1];
int y[MAX+1];
int m;


void adauga(int i,int j){
    int simp;

    m++;
    v[m].numa=y[j]-y[i];
    v[m].numi=x[j]-x[i];

    simp=cmmdc(v[m].numi,v[m].numa);
    v[m].numi/=simp;
    v[m].numa/=simp;

    if (v[m].numa<0){
        v[m].numa=-v[m].numa;
        v[m].numi=-v[m].numi;
    }
}


int main(){
    freopen ("trapez.in","r",stdin);
    freopen ("trapez.out","w",stdout);
    int i,j,n,cnt,rez;

    scanf ("%d",&n);

    for(i=1;i<=n;i++)
        scanf ("%d%d",&x[i],&y[i]);

    for(i=1;i<n;i++)
        for(j=i+1;j<=n;j++)
            adauga(i,j);

    n=(n-1)*n/2;
    sort(v+1,v+n+1,meow);

    rez=0;
    cnt=1;
    for(i=2;i<=n;i++){
        if (v[i]==v[i-1]) cnt++;
        else {
            rez=rez+(cnt-1)*cnt/2;
            cnt=1;
        }
    }

    printf ("%d",rez);
    return 0;
}