2018头条 笔试题

原题:
https://www.nowcoder.com/question/next?pid=8537290&qid=141068&tid=17473994
P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)

如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。

#include <bits/stdc++.h>

using namespace std;
#define M(a, b) memset(a,b,sizeof(a))

// memset(a,0x3f,sizeof(a))
//memset(a,0xcf,sizeof(a))
typedef long long LL;

const int maxn = 0x3f3f3f3f;


struct Node {
    int x, y;
};

bool node_compare(const Node &a, const Node &b) {
    return a.x < b.x;
}

struct node_compare {
    bool operator()(const Node &a, const Node &b) {
        return a.x < b.x;
    }
};

int main() {

    int n;
    cin >> n;
    int a, b;
    vector<Node> points;
    for (int i = 0; i < n; i++) {
        cin >> a >> b;
        Node node;
        node.x = a;
        node.y = b;
        points.push_back(node);
    }
    sort(points.begin(), points.end(), node_compare);

    int flag[n];
    M(flag, 0);
    flag[n - 1] = 1;
    int mmaxy = points[n - 1].y;

    for (int i = n - 2; i >= 0; i--) {
        if (points[i].y < mmaxy) continue;
        mmaxy = points[i].y;
        flag[i] = 1;
    }
    for(int i=0;i<n;i++){
        if(flag[i]){
            printf("%d %d\n", points[i].x , points[i].y);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lilele12211104/article/details/81587678