轰炸
题目描述
“我该怎么办?”飞行员klux向你求助。
事实上,klux面对的是一个很简单的问题,但是他实在太菜了。
klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。
输入输出格式
输入格式:
第一行为n
输入数据由n对整数组成(1<=n<=700),每对整数表示一个点的坐标。没有一个点会出现两次。
输出格式:
一个整数,表示一条直线能覆盖的最多的点数。
输入输出样例
输入样例#1:
5 1 1 2 2 3 3 9 10 10 11
输出样例#1:
3
说明
本题翻译并改编自uva270,数据及解答由uva提供。
思路:
暴力枚举。
一般式:a*x+b*x+c==0,
∵a*x[i]+b*y[i]+c=a*x[j]+b*y[j]+c=0;
∴a:b=(y[j]-y[i]):(x[i]-x[j]);
∴a=y[j]-y[i],b=x[i]-x[j],c=-a*x[i]-b*y[i].
代码实现:
1 #include<cstdio> 2 int n,a,b,c,x[710],y[710],now,ans; 3 int main(){ 4 scanf("%d",&n); 5 for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]); 6 for(int i=1;i<n;i++) 7 for(int j=i+1;j<=n;j++){ 8 a=y[j]-y[i];b=x[j]-x[i];c=-a*x[i]+b*y[i];now=0; 9 for(int k=1;k<=n;k++) if(a*x[k]-b*y[k]+c==0) ++now; 10 if(now>ans) ans=now; 11 } 12 printf("%d\n",ans); 13 return 0; 14 }
数学不好。
题目来源:洛谷