题目描述
“我该怎么办?”飞行员klux
向你求助。
事实上,klux
面对的是一个很简单的问题,但是他实在太菜了。
klux
要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux
遇到了抵抗,所以klux
只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。
输入格式
第一行为nn
输入数据由nn对整数组成(1 \le n \le700)(1≤n≤700),每对整数表示一个点的坐标。没有一个点会出现两次。
输出格式
一个整数,表示一条直线能覆盖的最多的点数。
输入输出样例
输入 #1复制
5
1 1
2 2
3 3
9 10
10 11
输出 #1复制
3
说明/提示
本题翻译并改编自uva270,数据及解答由uva提供。
代码来咯:
#include <bits/stdc++.h>
using namespace std;
int n,sum,sum2,ans;
double f[701][701],x[701],y[701];
int main()
{
cin>>n;
for (int i=1;i<=n;i++) cin>>x[i]>>y[i];
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
if (i==j) continue;
f[i][j]=(y[i]-y[j])/(x[i]-x[j]);
}
for (int i=1;i<=n;i++)
{
sort(f[i]+1,f[i]+n+1);
sum=0;sum2=0;
for (int j=3;j<=n;j++)
{
if (f[i][j]==f[i][j-1]) sum++,sum2=max(sum,sum2);//计算个数
else sum=0;
}
sum=max(sum,sum2);
ans=max(ans,sum);
}
cout<<ans+2<<endl;
return 0;
}
求点赞加关注!!!!