轰炸

题目描述

“我该怎么办?”飞行员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
",ans);
13     return 0;
14 }

数学不好。

题目来源:洛谷

原文地址:https://www.cnblogs.com/J-william/p/6295779.html