poj1118 Lining Up

http://poj.org/problem?id=1118

求在一条线上的点最多的点的个数

自己的代码  n^3

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

struct P
{
int x;
int y;
}point[710];

int main()
{
int n,i,j,t;
int max,sum;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&point[i].x,&point[i].y);
}
max=0;
for(i=0;i<n-1;i++)
{

for(j=i+1;j<n;j++)
{ sum=2;
for(t=j+1;t<n;t++)
{
if(((point[j].y-point[i].y)*(point[t].x-point[i].x)-(point[j].x-point[i].x)*(point[t].y-point[i].y))==0.0)
sum++;
}
if(max<sum)
max=sum;
}
}
printf("%d\n",max);
}
return 0;
}

后来看了别人的代码,比自己的快很多,提交上去,时间差了不少啊,也贴上来

思路:首先把所有点按照坐标排序,然后以每一个点为基准点,计算其他点与这个点连线的斜率,将所有斜率排序后求最多的相同的斜率数即可

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

#define inf 1e9
#define eps 1e-9

struct P
{
int x;
int y;
}point[702];

int cmp(struct P a,struct P b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}

double slope(struct P a,struct P b)
{
if(a.x==b.x)
return inf;
double px=a.x-b.x;
double py=a.y-b.y;
return py/px;
}

int main()
{
int n;
int i,j,cnt,t,max;
double k[702];
while(scanf("%d",&n)!=EOF&&n)
{
for(i=0;i<n;i++)
scanf("%d%d",&point[i].x,&point[i].y);
sort(point,point+n,cmp);
max=-1;
for(i=0;i<n;i++)
{
t=0;
for(j=i+1;j<n;j++)
{
k[t++]=slope(point[i],point[j]);
}
sort(k,k+t);
for(j=1,cnt=1;j<t;j++)
{
if(fabs(k[j]-k[j-1])<eps)
cnt++;
else
cnt=1;
if(cnt>max)
max=cnt;
}
}
printf("%d\n",max+1);
}
return 0;
}




你可能感兴趣的:(poj)