ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【luogu】p2772 寻找平面上的极大点

2020-01-30 10:02:41  阅读:213  来源: 互联网

标签:include point int luogu 枚举 num 纵坐标 平面 p2772


一个水题

一种比较简单的思路:贪心

我们可以对于每一个点根据x从小到大排好序

这样对于每一个点,只需要不存在序列中在它后面并且纵坐标大于它的点

那么我们当前枚举的这个点就是满足题意的点

但显然,从小到大枚举并查询后面是否有纵坐标大于该点的点相对会复杂一些

我们可以考虑倒序来枚举

记录下当前枚举到点中纵坐标的最大值,这样每枚举到的点只需要与最大值比较即可

如果它大于最大值,即为符合题意的点

但这种贪心策略只能得到90分

为什么?

我们按照x又小到大排序的时候忽略了x相等,也就是在一列的点的情况

只需要先按照x排序,x相等再按照y排序就行了

code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
int read(){
    int a = 0,f = 0;char p = getchar();
    while(!isdigit(p)){f|=p=='-';p = getchar();}
    while(isdigit(p)){a = (a << 3) + (a << 1) + (p^48);p = getchar();}
    return f?-a:a;
} 
int n;
struct node{
    int x,y,bh;
}point[500001];
//int tot[500001];
//bool flag[500001];
bool cmp1(node a,node b){
    if(a.x!=b.x){
        return a.x < b.x;
    }
    return a.y < b.y;
}
int ansx[500001],ansy[500001];
void _Solve(){
    sort(point+1,point+n+1,cmp1);
    int now = 0,num = 0;
    for(int i = n;i >= 1;i--){
        if(point[i].y > now){
            ansx[++num] = point[i].x;
            ansy[num] = point[i].y;
            now = point[i].y;
        }
    }
    for(int i = num;i >= 2;i--){
        cout <<"("<< ansx[i] <<","<< ansy[i]<<")"<<",";
    }
    cout<<"("<<ansx[1]<<","<<ansy[1]<<")";
}
int main(){
    n = read();
    for(int i = 1;i <= n;i ++){
        point[i].x = read();
        point[i].y = read();
        point[i].bh = i;
    }
    _Solve();
}

啊好了没了就写了这么多qwq

标签:include,point,int,luogu,枚举,num,纵坐标,平面,p2772
来源: https://www.cnblogs.com/huixinxinw/p/12242166.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有