轰炸

简单题,练练手

题目描述

“我该怎么办?”飞行员klux向你求助。

事实上,klux面对的是一个很简单的问题,但是他实在太菜了。

klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法转弯。现在他想一次轰炸最多的地方。

输入输出格式

输入格式:

第一行为nn

输入数据由nn对整数组成(1 \le n \le700)(1≤n≤700),每对整数表示一个点的坐标。没有一个点会出现两次。

输出格式:

扫描二维码关注公众号,回复: 3324530 查看本文章

一个整数,表示一条直线能覆盖的最多的点数。

输入输出样例

输入样例#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;
}
 

猜你喜欢

转载自blog.csdn.net/FireflyNo1/article/details/82795164
今日推荐