洛谷P1142轰炸(改编自Uva270)

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

一开始看到这道题想当然的认为只有4种方向能飞,结果当然是听取WA声一片。后来发现直线不一定要是45度。

通过判断k值是否一样来确定三个点是否在同一直线上,
于是就想到了计算出每两个点之间的k值,用map记录每个k值出现的次数
最终找到最大的那个便是答案

下面是代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
struct node {
    int x, y;
};
double getk(node a, node b)
{
    return (double)(b.y-a.y)/(b.x-a.x);
}//计算k值
int main()
{
    int n, maxn{1};
    node f[1000];//用于记录每个点的坐标
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> f[i].x >> f[i].y;
    }//enter
    for (int i=0; i<n-1; i++) {
        map<double, int> m;//记录各个点的k值
        for (int j=i+1; j<n; j++) {
            m[getk(f[i], f[j])]++;
        }
        double maxk{0};
        int maxans{0};
        for (auto it = m.begin(); it != m.end(); it++) {
            if (it->second > maxans) {
                maxans = it->second;
                maxk = it->first;
            }
        }//找出最大值
        maxn = max(maxn, maxans+1);
    }
    cout << maxn <<endl;
    return 0;
}

你可能感兴趣的:(洛谷P1142轰炸(改编自Uva270))