轰炸
轰炸
题目描述
“我该怎么办?”飞行员klux向你求助。
事实上,klux面对的是一个很简单的问题,但是他实在太菜了。
klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。
事实上,klux面对的是一个很简单的问题,但是他实在太菜了。
klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。
输入
第一行为n
接下来的输入数据由n对整数组成(1<=n<=700),每对整数表示一个点的坐标。没有一个点会出现两次。
接下来的输入数据由n对整数组成(1<=n<=700),每对整数表示一个点的坐标。没有一个点会出现两次。
输出
一个整数,表示一条直线能覆盖的最多的点数。
样例输入
5
1 1
2 2
3 3
9 10
10 11
样例输出
3
分析:由于点很少,直接枚举直线即可,对每个点向量法(取gcd)也可;
代码:
#include <bits/stdc++.h> #define ll long long const int maxn=1e5+10; using namespace std; int n,m,k,t,ans,a[maxn],b[maxn]; int main() { int i,j; scanf("%d",&n); for(i=0;i<n;i++)scanf("%d%d",&a[i],&b[i]); for(i=0;i<n;i++) for(j=i+1;j<n;j++) { int c=b[j]-b[i],d=a[i]-a[j],e=b[i]*a[j]-b[j]*a[i],now=0; for(k=0;k<n;k++) { if(c*a[k]+d*b[k]+e==0)++now; } ans=max(ans,now); } printf("%d\n",ans); //system("pause"); return 0; }