不平行的直线

 

题目描述

在坐标纸上有N个不重合的点,两两可以连一个线段并延伸成直线,请问在这些直线里最多能选出多少条使得他们两两不平行也不重合。

输入描述:

第1行: 输入1个正整数:N

第2..N+1行:第i+1行是两个用空格隔开的整数,为点i的坐标(Xi,Yi)

输出描述:

输出1个整数,为最多的互不平行的直线数目。
示例1

输入

复制
3
1 0
-2 0
0 0

输出

复制
1

备注:

N200,1000Xi,Yi1000

思路:枚举出所有的斜率,用set去重,注意用double类型

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn=1e6;
double marr[maxn];
struct point
{
    double x;
    double y;
}arr[205];

double gradient(double x,double y,double w,double v)
{
    double ans;
    if(x==w)
    {
        ans=INF;
    }
    else
        ans=(y-v)/(x-w);
    return ans;
}

int main()
{
    int n; cin>>n;
    int i,j,k=0;
    for(i=0;i<n;i++)
        cin>>arr[i].x>>arr[i].y;
    for(i=0,j=1;i<=j&&j<n;)
    {
        marr[k++]=gradient(arr[i].x,arr[i].y,arr[j].x,arr[j].y);
        if(j==n-1)
        {
            i++;j=i+1;
        }else j++;
    }
    set<double>s(marr,marr+k);
    cout<<s.size()<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/adventurer-/p/12977464.html