题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=206
题意:给你n个点,求最多的位于一条线上的点数
思路:枚举起点,计算其他点与起点的斜率,并排序,然后找有多少个点与起点的斜率相等,相等的就在一条线上,O(n²logn)
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int INF = 2147483647;
const int MAXN = 1e6 + 5;
struct coordinate {
float x, y;
}nodes[707];
float numbers[707];
int main() {
int t;
scanf("%d", &t);
getchar();
getchar();
while (t--) {
int k = 0;
char data[112];
while (gets(data)) {
if (!data[0]) {
break;
}
sscanf(data, "%f %f", &nodes[k].x, &nodes[k].y);
k++;
}
int ans = 2;
for (int i = 0; i < k; i++) {
int c = 0;
for (int j = 0; j < k; j++) {
if (i == j)continue;
numbers[c++] = (nodes[i].y - nodes[j].y) / (nodes[i].x - nodes[j].x);
}
sort(numbers, numbers + c);
for (int b = 0; b < c; b++) {
int m, l, num;
for (m = b, l = b + 1, num = 2; numbers[m] == numbers[l]; m++, l++, num++);
if (num > ans)
ans = num;
}
}
printf("%d\n", ans);
if (t) {
printf("\n");
}
}
return 0;
}