Total Submission(s): 1251 Accepted Submission(s): 356
Indeed, the pilot was not facing an easy task. She had to drop packages at specific points scattered in a dangerous area. Furthermore, the pilot could only fly over the area once in a straight line, and she had to fly over as many points as possible. All points were given by means of integer coordinates in a two-dimensional space. The pilot wanted to know the largest number of points from the given set that all lie on one line. Can you write a program that calculates this number?
Your program has to be efficient!
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#define INF 0x3f3f3f3f
#define ull unsigned long long
#define ll long long
#define IN __int64
#define N 710
#define M 100000000
using namespace std;
struct zz
{
int x;
int y;
}p[N];
int cmp(zz a,zz b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
struct ss
{
double k;
double b;
}pp[N*N];
bool cmpp(ss a,ss b)
{
if(a.k==b.k)
return a.b<b.b;
return a.k<b.k;
}
int main()
{
int n,i,j,k;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+n,cmp);
int kk=0;
int km=0;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
int x=p[j].x-p[i].x;
int y=p[j].y-p[i].y;
pp[kk].k=y*1.0/x;
pp[kk].b=p[i].y-pp[kk].k*p[i].x;
kk++;
}
}
sort(pp,pp+kk,cmpp);
int m=1,mm=1;
ss f=pp[0];
for(i=1;i<kk;i++)
{
if(fabs(pp[i].k-f.k)<1e-6&&fabs(f.b-pp[i].b)<1e-6)
{
m++;
mm=max(mm,m);
}
else
{
f=pp[i];
m=1;
}
}
if(n==1)
printf("1\n");
else if(n==2)
printf("2\n");
else
{
if(mm==3)
printf("%d\n",mm);
else
{
mm*=2;
for(int i=1;i<=n;i++) //去重公式
{
if(i*(i+1)==mm)
{
printf("%d\n",i+1);
break;
}
}
}
}
}
return 0;
}