题解 | #ZJ13 最大点集#(排序)

最大点集

https://www.nowcoder.com/practice/089dbc5ec7ac468589ce143d43248949

解题思路

1.数组所有点横坐标不一样,按横坐标升序排列,最大点其实就是横坐标或纵坐标大于等于其他所有点的点;当前i位置点能成为最大点的条件是,i的纵坐标大于等于[i+1:n-1]区间位置点的纵坐标,故逆序遍历数组,x保存[i+1:n-1]区间最大纵坐标值,当i的纵坐标大于等于x时,当前点即为最大点,保存当前点的坐标,最后逆序输出坐标值;

代码

#include <bits/stdc++.h>

using namespace std;

int main(){
    int n ;
    cin >> n;
    vector<pair<int, int>> v(n);
    for(int i = 0; i < n; i++){
        cin >> v[i].first >> v[i].second;
    }
    sort(v.begin(), v.end(), [&](pair<int, int>& p1, pair<int, int>& p2){
        return p1.first < p2.first; //所有点横坐标不一样,按横坐标升序排列
    });
    vector<pair<int, int>> ans;
    for(int i = n - 1, x = 0; i >= 0; i--){ //逆序遍历,如果当前元素的纵坐标大于等于x,则当前元素即为最大点
        if(v[i].second >= x){
            ans.push_back({v[i].first, v[i].second});
            x = v[i].second; //x为纵坐标的最大值
        }
    }
    int m = ans.size();
    for(int i = m - 1; i >= 0; i--){ //需要逆序输出
        cout << ans[i].first << " " << ans[i].second << endl;
    }
    return 0;
}
全部评论

相关推荐

🎓学历背景:双非土木硕👨‍💻意向职位:AI应用开发大佬们可以帮我看看简历吗,秋招至今0offer
秋招结束再玩瓦:今年科班都不好找哇……你可以试试交叉岗,比如制造业国企的一些开发算法,或者互联网的边缘岗,it技术支持,运维这些
我的简历长这样
点赞 评论 收藏
分享
10-17 09:06
门头沟学院 Java
8527睿:有些地方感觉不太契合实际啊。简单看看第二个项目那里。 比如canal流式读取数据库日志进行缓存同步那里。可不可以加个消息中间件来确保SQL语句的削峰填谷。一般都是canal+消息中间件 双层鉴权登录那里,描述有点模糊,登录是鉴权的前提唉,后面功能都在说是登录,鉴权没有啊
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务