B-不平行直线

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

输入描述:

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

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

输出描述:

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

示例1
输入
复制

3
1 0
-2 0
0 0

输出
复制

1

备注:

N≤200,−1000≤Xi,Yi≤1000N \leq 200,-1000 \leq X_i,Y_i \leq 1000N≤200,−1000≤Xi​,Yi​≤1000

#include 

using namespace std;

int x[201], y[201];

bool hn;

double ans[40001];

int cnt;

int main()

{

    int n;

    cin >> n;

    for (int i = 1; i <= n; i++)

        cin >> x[i] >> y[i];

    for (int i = 1; i <= n; i++)

    {

        for (int j = i + 1; j <= n; j++)

        {

            if (x[i] == x[j])

                ans[++cnt] = 100;

            else

                ans[++cnt] = (y[i] - y[j]) * 1.0 / (x[i] - x[j]) * 1.0;

        }

    }

    sort(ans + 1, ans + cnt + 1);

    int sum = 1;

    for (int i = 2; i <= cnt; i++)

        if (abs(ans[i] - ans[i - 1]) > 1e-9)

            sum++;

    cout << sum;

}

你可能感兴趣的:(基础算法)