Cod sursa(job #2073373)

Utilizator biaiftimeIftime Bianca biaiftime Data 23 noiembrie 2017 00:01:52
Problema Trapez Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <stdio.h>
#include <stdlib.h>
#define Nmax 1002
#define Mmax 600002
FILE *f,*g;
typedef struct
{
    int a,b;
}fractie;
typedef struct
{
    int x,y;
}punct;
fractie panta[Mmax];
punct a[Nmax];
int n,k;
void Read(int *n,punct a[Nmax])
{
    int i;
    fscanf(f,"%d",n);
    for(i=1;i<=*n;++i)
    fscanf(f,"%d %d",&a[i].x,&a[i].y);
}
int Cmmdc(int x,int y)
{
    int r;
    while(y!=0)
    {
        r=x%y;
        x=y;
        y=r;
    }
    return x;
}
void Calcul(int n,punct a[Nmax],fractie panta[Mmax],int *k)
{
    int i,j,val;
    *k=-1;
    for(i=1;i<=n-1;++i)
    for(j=i+1;j<=n;++j)
    {
        ++*k;
        panta[*k].a=a[i].y-a[j].y;
        panta[*k].b=a[i].x-a[j].x;
        if(panta[*k].b!=0)
        {
        val=Cmmdc(panta[*k].a,panta[*k].b);
        panta[*k].a/=val;
        panta[*k].b/=val;
        if(panta[*k].a<0&&panta[*k].b<0)
        {
            panta[*k].a*=-1;
            panta[*k].b*=-1;
        }
        else if(panta[*k].a>0&&panta[*k].b<0)
        {
            panta[*k].a*=-1;
            panta[*k].b*=-1;
        }
        }
    }
}
int Comp(const void *a,const void *b)
{
    fractie *pa=(fractie*)a;
    fractie *pb=(fractie*)b;
    if(pa->a*pb->b>pa->b*pb->a)return 1;
    if(pa->a*pb->b==pa->b*pb->a)return 0;
    return -1;
}
int Combinari(int x)
{
    return (x*(x-1))/2;
}
long long int Solve(int n,fractie panta[Mmax],int k)
{
    int i=0,nr=0,j;
    int nrfin=0;
    while(i<k)
    {
        nr=1;j=i+1;
        while(j<k&&panta[i].a==panta[j].a&&panta[i].b==panta[j].b){++nr;++j;}
        if(nr!=1) nrfin=nrfin+Combinari(nr);
        i=j;
    }
    return nrfin;
}
int main()
{
    f=fopen("trapez.in","r");
    g=fopen("trapez.out","w");
    Read(&n,a);
    fclose(f);
    Calcul(n,a,panta,&k);
    ++k;
    qsort(panta,k,sizeof(fractie),Comp);
    /*int i;
    for(i=0;i<k;++i)fprintf(g,"%lld %lld\n",panta[i].a,panta[i].b);*/
    fprintf(g,"%d",Solve(n,panta,k));
    fclose(g);
    return 0;
}