欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-01 17:29:44
...

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

思路:肯定联想到用斜率或者向量的形式来求呀, 所以我们用向量方便一点, 我们任取两个点作为基准点, 算出一个向量(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);
}