连续下了几天雨,心烦,头痛,这样一道题目居然连思路都没有,还是看别人博客做出来的。
原因有二,我不熟悉c++map容器,我静不下心。
题意:2D平面上N个点,坐标都是整数,问最多有多少个点能落在同一条直线上。最直接的做法是O(N^3),直接枚举任意两点组成的直线,再统计跟它们共线的点。 但这个题目N<700,那么N^3=700*700*700=3.43*10^8,在TL为1S的题目面前是行不通的。 因为共线的点它们两两的斜率肯定相等,所以我们可以选择一个点作为参考点,枚举其它点,统计出现的斜率的最多次数就OK了。 这里可以用个map
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
const int N=705;
map<double,int> MP;
map<int,int> X;
double x[N],y[N];
int ans,cnt;
double tmp;
int main()
{
int n;
while(cin>>n)
{
X.clear();
ans=0;
tmp=0;
for(int i=0;i<n;i++)
{
cnt=0;
MP.clear();
cin>>x[i]>>y[i];
ans=max(ans,++X[x[i]]);
for(int j=0;j<i;j++)
{
if(x[i]==x[j]) continue;
tmp=(y[i]-y[j])/(x[i]-x[j]);
cnt=max(cnt,++MP[tmp]);
}
ans=max(ans,cnt+1);
}
cout<<ans<<endl;
}
return 0;
}