问题描述
给定2维平面上n个整点的坐标,一条直线最多能过几个点?
输入格式
第一行一个整数n表示点的个数
以下n行,每行2个整数分别表示每个点的x,y坐标。
输出格式
输出一个整数表示答案。
样例输入
5
0 0
1 1
2 2
0 3
2 3
样例输出
3
数据规模和约定
n<=1500,数据保证不会存在2个相同的点。
点坐标在int范围内
#include<iostream>
using namespace std;
int main() {
int n;
int x[1501] = {0};
int y[1501] = {0};
int num = 2;
cin >> n;
for (int i = 0; i < n; i ++) {
cin >> x[i] >> y[i];
}
for (int i = 0; i < n; i ++) {
for (int j = i + 1; j < n; j ++) {
int kx = x[j] - x[i];
int ky = y[j] - y[i];
int temp = 2;
for (int l = j + 1; l < n; l ++) {
if ((y[l] - y[j]) * kx == (x[l] - x[j]) * ky) {
temp++;
}
}
num = max(num, temp);
}
}
cout << num;
return 0;
}
总结:
遍历每两个点,然后找这与两个点相同斜率的点,有就+1,然后遍历完一遍后和num比较
取较大值