[题解]AT_abc248_e [ABC248E] K-colinear Line

思路

首先,我们得清楚如何判断三点共线。

对于每一个点,它的横纵坐标都有这么一个关系:n×x+m=y(其中 n,m 为常数)。

那么,对于三点共线的点来说,n,m 是相同的。因此我们得出三个式子。

n×xa+m=ya

n×xb+m=yb

n×xc+m=yc

我们用二式减去一式,得:n=ybyaxbxa

用三式减去一式,得:n=ycyaxcxa

如果这三个点在同一直线上,它们的 n 是相同的。

所以,判断三点共线的条件就是:ybyaxbxa=ycyaxcxa

为了避免精度问题,直接改为乘法:(xcxa)×(ybya)=(xbxa)×(ycya)

然后,我们暴力枚举二个点,再看一下能与这两个点共线的点的数量。

如果大于了 K,就将答案加 1

注:在 K1 的情况下是有无数条直线的。

Code

#include <bits/stdc++.h>  
#define re register  
  
using namespace std;  
  
const int N = 310;  
int n,m,ans;  
int x[N],y[N];  
  
inline int read(){  
    int r = 0,w = 1;  
    char c = getchar();  
    while (c < '0' || c > '9'){  
        if (c == '-') w = -1;  
        c = getchar();  
    }  
    while (c >= '0' && c <= '9'){  
        r = (r << 3) + (r << 1) + (c ^ 48);  
        c = getchar();  
    }  
    return r * w;  
}  
  
inline bool check(int a,int b,int c){//公式   
    return ((x[c] - x[a]) * (y[b] - y[a]) == (x[b] - x[a]) * (y[c] - y[a]));  
}  
  
int main(){  
    n = read();  
    m = read();  
    for (re int i = 1;i <= n;i++){  
        x[i] = read();  
        y[i] = read();  
    }  
    if (m == 1){//特判   
        puts("Infinity");  
        return 0;  
    }  
    for (re int i = 1;i <= n;i++){//枚举前两点   
        for (re int j = i + 1;j <= n;j++){  
            bool falg = true;  
            for (re int k = 1;k < j;k++){//算是去重吧,因为我们枚举的点是直线中最低的点,如果有了更低的点说明重复了   
                if (k != i && check(i,j,k)){  
                    falg = false;  
                    break;  
                }  
            }  
            if (falg){  
                int res = 2;//算共线的数量   
                for (re int k = j + 1;k <= n;k++){  
                    if (check(i,j,k)) res++;  
                }  
                if (res >= m) ans++;//判断,更新答案   
            }  
        }  
    }  
    printf("%d",ans);  
    return 0;  
}  

作者:WaterSun

出处:https://www.cnblogs.com/WaterSun/p/18261972

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   WBIKPS  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示