问题 H: LU的困惑

Master LU 非常喜欢数学,现在有个问题:在二维空间上一共有n个点,LU每连接两个点,就会确定一条直线,对应有一个斜率。现在LU把平面内所有点中任意两点连线,得到的斜率放入一个集合中(若斜率不存在则不计入集合),他想知道这个集合中有多少个元素。

 

 
第一行是一个整数T,代表T组测试数据

每组数据第一行是一个整数n,代表点的数量。2<n<1000

接下来n行,每行两个整数,0<=x<10000,0<=y<10000,代表点的坐标

 
输出斜率集合中有多少个元素
2
4
1 1
2 2
3 3
3 6
4
1 1
2 2
2 0
3 1
3
3


#include<stdio.h>
#include<iostream>
#include<malloc.h>
#include<algorithm>
using namespace std;
double k(int,int,int ,int);
int main()
{
    double *res=(double*)malloc(sizeof(double)*1000000);
    int num=0;
    int n;
    scanf("%d",&num);
    while(num--)
    {
        for(int i=0;i<1000000;i++)
            res[i]=0;
        scanf("%d",&n);
        int *x=(int *)malloc(sizeof(int)*(n+1));
        int *y=(int *)malloc(sizeof(int)*(n+1));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x[i],&y[i]);
        }
        int len=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                res[len++]=k(x[i],y[i],x[j],y[j]);
            }
        }

        sort(res,res+len);
  //      for(int i=0;i<len;i++)
  //          printf("%f\n",res[i]);
        int s=0;
        for(int i=0;i<len-1;i++)
        {
            if(res[i]!=res[i+1])
                s++;
        }
        printf("%d\n",s);

    }
}

double k(int x1,int y1,int x2,int y2)
{
    return ((double)(x1-x2))/(y1-y2);
}

 

posted on 2020-04-27 15:17  沈香茶  阅读(291)  评论(0)    收藏  举报