洛谷 1142 轰炸 【判断点是否在同一条直线上】

传送门
// 思路: 就是问最多有多少个点在同一条直线上.

思路:肯定联想到用斜率或者向量的形式来求呀, 所以我们用向量方便一点, 我们任取两个点作为基准点, 算出一个向量(x1, y1), 然后枚举第三个点, 算第二个点和第三个点的之间的向量, 然后通过判断向量是否平行的方式来判断这三点是否处于同一直线上, 也就是 x1*y2 == x2*y1…. 复杂度O(n^3), 这题数据弱让我卡过去了, 也许这个OJ1s能跑1e9了? (逃

AC Code

const int maxn = 7e2+5;
pii po[maxn];
void solve()
{
    int n;
    scanf("%d", &n);
    for (int i = 1 ; i <= n ; i ++) {
        scanf("%d%d", &po[i].fi, &po[i].se);
    }
    int ans = 0;
    for (int i = 1 ; i <= n ; i ++) {
        for (int j = i+1 ; j <= n ; j ++) {
            int cnt = 2;
            int x1 = po[i].fi - po[j].fi;
            int y1 = po[i].se - po[j].se;
            for (int k = 1 ; k <= n ; k ++) {
                if (k == i || k == j) continue;
                int x2 = po[j].fi - po[k].fi;
                int y2 = po[j].se - po[k].se;
                if (x1*y2 == x2*y1) cnt++;
            }
            ans = max(ans, cnt);
        }
    }
    printf("%d\n", ans);
}

你可能感兴趣的:(数学距离_计算几何)