简单题,练练手
题目描述
“我该怎么办?”飞行员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提供。
题解: 主要运用向量的知识,不计算斜率可以不考虑小数的计算。
c++程序:
#include <iostream>
using namespace std;
struct point {
int x, y;
};
point p[700];
int n, ans = 0,cnt;
int main() {
cin >> n;
for(int i = 0; i < n; i++) cin >> p[i].x >> p[i].y;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n ; j++) {
if(j != i) {
point vec1;//用坐标代替向量 , 如果向量相同那么他就是 平行的
vec1.x = p[i].x - p[j].x;
vec1.y = p[i].y - p[j].y;
cnt = 2;
for(int k = 0; k < n; k++) {
if(k != i && k != j) {
point vec2;
vec2.x = p[i].x - p[k].x;
vec2.y = p[i].y - p[k].y;
if(vec1.x*vec2.y == vec1.y*vec2.x) cnt++;
}
}
ans = max(ans,cnt);
}
}
}
cout << ans ;
return 0;
}