AtCoder Beginner Contest 248 E - K-colinear Line // 计算几何
原题链接:E - K-colinear Line (atcoder.jp)
题意:
给出直角坐标系上N个点(N <= 300),求经过这些点中至少K个点的直线数量,若有无穷多条,则输出"Infinity"。
思路:
两点确定一条直线:
当K=1时,答案自然是无穷多条。
当K >= 2时,我们可以枚举两点,求出其确定的直线,再枚举所有点,判断该直线经过的点数是否不少于K。
求直线方程:用直线的一般式方程Ax+By+C=0(普适性)来表示直线。
已知经过点(x1,y1),(x2,y2),那么A = y2 - y1, B = x1 - x2, C = x2 * y1 - x1 * y2。
为了方便直线的判重,对参数进行处理(唯一性),使得:ABC三数公因数为1,A > 0 或 A = 0 且 B > 0。
代码参考:
//Jakon:计算几何
#include <bits/stdc++.h>
#define int long long
using namespace std; const int N = 310; int n, k, x[N], y[N];
set<array<int,3>> S; int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
} signed main()
{
cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> x[i] >> y[i]; if(k == 1) {
cout << "Infinity" << endl;
return 0;
} for(int i = 1; i <= n; i++) {
for(int j = i + 1; j <= n; j++) {
// A = y2 - y1, B = x1 - x2, C = x2 * y1 - x1 * y2
int A = y[j] - y[i], B = x[i] - x[j];
int C = x[j] * y[i] - x[i] * y[j];
int g = gcd(gcd(A, B), C);
A /= g, B /= g, C /= g;
if(A < 0 || A == 0 && B < 0) {
A = -A, B = -B, C = -C;
}
int cnt = 0;
for(int k = 1; k <= n; k++) {
if(A * x[k] + B * y[k] + C == 0) ++ cnt;
}
if(cnt >= k) S.insert({A, B, C});
}
}
cout << S.size() << endl; return 0;
}
AtCoder Beginner Contest 248 E - K-colinear Line // 计算几何的更多相关文章
- Atcoder beginner contest 249 C-Just K(二进制枚举)
题目大意:给你N个字符串,你可以从中选择任意数量的字符串,请统计在你的字串中,相同字母出现次数正好为K次的字母数.数据保证出现的字母都是小写字母. 1≤N≤15 1 ≤K≤N 一开始读题的时候读错了, ...
- AtCoder Beginner Contest 154 题解
人生第一场 AtCoder,纪念一下 话说年后的 AtCoder 比赛怎么这么少啊(大雾 AtCoder Beginner Contest 154 题解 A - Remaining Balls We ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
- AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】
AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...
- AtCoder Beginner Contest 068 ABCD题
A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...
- AtCoder Beginner Contest 153 题解
目录 AtCoder Beginner Contest 153 题解 A - Serval vs Monster 题意 做法 程序 B - Common Raccoon vs Monster 题意 做 ...
随机推荐
- linux的简介与安装
linux简介: https://www.cnblogs.com/pyyu/p/9277153.html Linux就是个操作系统:它和Windows XP.Windows7.8.10什么的一样就是一 ...
- HamsterBear Linux Low Res ADC按键驱动的适配 + LVGL button移植
HamsterBear lradc按键驱动的适配 平台 - F1C200s Linux版本 - 5.17.2 ADC按键 - 4 KEY tablet 驱动程序位于主线内核: drivers/inpu ...
- spring 事务传播(Propagation)
propagation 一共有以下几种选项: 1. REQUIRED(默认): 使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法必须运行在一个事务中:如果当前存在事务,则加入这个事务,成为 ...
- 590. N-ary Tree Postorder Traversal - LeetCode
Question 590. N-ary Tree Postorder Traversal Solution 题目大意:后序遍历一个树 思路: 1)递归 2)迭代 Java实现(递归): public ...
- Fail2ban 术语
filter 过滤器,使用正则表达式定义一个过滤器,从日志中匹配到IP.端口等. action 动作,定义在指定时间段要执行的操作. jail 监禁,jail是一个filter和一个action或者多 ...
- SPFA 最短路算法
SPFA算法 1.什么是spfa算法? SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA一般情况复杂度是O(m)O(m) ...
- Flink整合面向用户的数据流SDKs/API(Flink关于弃用Dataset API的论述)
动机 Flink提供了三种主要的sdk/API来编写程序:Table API/SQL.DataStream API和DataSet API.我们认为这个API太多了,建议弃用DataSet API,而 ...
- VS Code - Vim 插件自动切换输入法
前言: 在使用 Linux 的过程中,vim 是一个不错的编辑器,以至于多数人将其用成了习惯,在没有 vim 的环境下还是习惯用 vim 的快捷键来编辑文本.所以便有开发者们为众多的 IDE 和文本编 ...
- fiddler的安装以及使用同时对Android 与IOS 抓包配置进行分析 进阶 一
由于工作方向的原因,很久没有用过APP抓包工具了,有那么一天遇到了bug需要协助开发工程师进行定位分析,然后又重新梳理了一下之前常用的抓包工具,这里重点介绍一下目前市面上最流行的几款抓包工具,根据自己 ...
- Xmind头脑风暴
下图导出到excel后 上图对应的excel表格如下: