题目大意:给出一些点,问最多有几个点共线。
解题思路:用斜率相等判断共线,首先斜率
k=y1−y2x1−x2
,对于三点
y1−y2x1−x2=y1−y3x1−x3
即三点共线,这里交叉相乘即得到
(y1−y2)(x1−x3)=(y1−y3)(x1−x2)
,然后直接暴力,时间确实慢。另外是最近几题输入都挺烦人的,这里用 sscanf 方便一点。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<map>
using namespace std;
struct node {
int x, y;
}p[705];
int t, ans;
char str[100];
void solve() {
for (int i = 0; i < t; i++)
for (int j = i+1; j < t; j++) {
int tmp = 0;
for (int k = 0; k < t; k++)
if ((p[i].y-p[j].y)*(p[i].x-p[k].x) == (p[i].y-p[k].y)*(p[i].x-p[j].x))
tmp++;
if (tmp > ans) ans = tmp;
}
}
int main() {
int N;
scanf("%d", &N);
getchar();getchar();
while (N--) {
ans = t = 0;
while (gets(str) && str[0] !='\0') {
sscanf(str, "%d%d", &p[t].x, &p[t].y);
t++;
}
solve();
printf("%d\n", ans);
if (N) printf("\n");
}
return 0;
}