-
给定平面上的n个点,任意做一条直线,求至多能有几个点恰好落在直线上。
诶。。这题虽然水,但要注意还有重复的点。。WA了n多次,最后写的还特别乱,总算是A过了
另外也要注意斜率为无穷大的情况,和浮点数相等的判断
题目描述:
-
输入:
-
包含多组测试数据,每组测试数据由一个整数n(0<=n<=100)开始,代表平面上点的个数。
接下去n行每行给出一个点的坐标(x,y),x、y的绝对值均小于等于100。
-
输出:
-
对于每组测试数据,输出一个整数,表示至多能有几个点恰好落在直线上。
-
样例输入:
-
2 0 0 1 1 4 0 0 1 1 2 2 3 6
-
样例输出:
-
2 3
-
#include <iostream> #include <stdio.h> #include <algorithm> #include <cmath> using namespace std; const int INF = 999999999; int equal(double a, double b) { if(fabs(a-b) < 1e-8) return 1; return 0; } int main() { freopen("Test.txt","r",stdin); int n; while(scanf("%d",&n) != EOF) { double x[110], y[110]; int i, j; int sum = 2; for(i = 0; i < n; i++) { scanf("%lf%lf",&x[i],&y[i]); int ecnt = 0; double buf[10001]; int top = -1; for(j = 0; j < i; j++) { if(equal(x[i],x[j]) == 0) buf[++top] = (y[i]-y[j]) / (x[i]-x[j]); else if(equal(x[i],x[j]) == 1 && equal(y[i],y[j]) == 1) ecnt++; else if(equal(x[i],x[j]) == 1 && equal(y[i],y[j]) == 0) buf[++top] = INF; } sort(buf,buf+top+1); if(sum < ecnt+1) sum = ecnt+1; int p = 0; while(p < top+1) { int cnt = 2; int k = p+1; while(k < top+1 && equal(buf[k],buf[k-1])) { cnt++; k++; } p = k; if(sum < cnt+ecnt) { sum = cnt+ecnt; } } } if(n == 0 || n == 1) printf("%d\n",n); else printf("%d\n",sum); } return 0; }