ABC 248 | E - K-colinear Line
题目描述
给定平面上不相重合的个点,计算穿过其中个点的线的条数,若有无穷条,输出Infinity
数据范围
- or,if
题解
若,则答案为Infinity
若,由于两点确定一条直线且本题至多有个点,可以暴力枚举两个点,然后枚举剩余点是否在该直线上,通过一个二维数组记录第和点与第个点所在直线是否被计算,对于在一条直线上的个点,两两之间不该被再次计算。
通过的直线可被表示为,判断点是否在所在直线上,可通过,即
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
typedef long long ll;
using namespace std;
typedef pair<ll, ll> pii;
const int N = 310;
pii a[N];
ll n, k;
bool st[N][N];
vector<int> vec;
int main()
{
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i ++){
ll x, y;
scanf("%lld%lld", &x, &y);
a[i] = {x, y};
}
if(k == 1) puts("Infinity");
else{
int ans = 0;
for(int i = 0; i < n; i ++){
for(int j = i + 1; j < n; j ++){
if(!st[i][j]){
int cnt = 2;
vec.clear();
vec.push_back(i), vec.push_back(j);
for(int l = j + 1; l < n; l ++){
ll x0 = a[i].first, y0 = a[i].second;
ll x1 = a[j].first, y1 = a[j].second;
ll x2 = a[l].first, y2 = a[l].second;
if((y1 - y0) * (x2 - x0) == (y2 - y0) * (x1 - x0)){
vec.push_back(l);
cnt ++;
}
}
for(int x = 0; x < vec.size(); x ++){
for(int y = 0; y < vec.size(); y ++){
st[vec[x]][vec[y]] = true;
}
}
if(cnt >= k) ans ++;
}
}
}
printf("%d\n", ans);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架