您的位置:首页 > 运维架构

OpenJudge - 2704 寻找平面上的极大点 贪心+使用map优化 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 1

2016-09-10 16:32 489 查看
【问题描述】

在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b;用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。



给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。请编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标。

【输入格式】

输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的坐标,坐标值都是整数,坐标范围从0到100,输入数据中不存在坐标相同的点。

【输出格式】

按x轴坐标最小到大的顺序输出所有极大点。输出格式为:(x1,y1),(x2,y2),…(xk,yk),按x由小到大,x相同则按y由小到达输出。注意:输出的每个点之间有”,”分隔,最后一个点之后没有”,”,少输出和多输出都会被判。

【输入样例】

5
1 2
2 2
3 1
2 3
1 4


【输出样例】

(1,4),(2,3),(3,1)


【样例解释】

样例的点和极大点的图形如下:



【数据范围】

80%的数据满足:n<=6000

100%的数据满足:n<=100000

【来源】

http://noi.openjudge.cn/ch0406/2704/

思路:暴力算法可通过80%数据。然后想到用贪心进行优化,将坐标按横坐标由小到大,横坐标相等时纵坐标由小到大进行排序。另外在输入数据时用map记录在同一横坐标上的最大的纵坐标。(因为对map的使用不是很熟悉,忘记了find函数,因此考试时使用map的时间复杂度与没有优化一样。)

/*
Name: point.cpp
Copyright: Twitter & Instagram @stevebieberjr
Author: @stevebieberjr
Date: 10/09/16 16:38
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;

int n;

struct point
{
int x,y;
}p[100005];

bool cmp(point a,point b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}

map<int,int>mp;
map<int,int>::iterator it;

int main()
{
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);

scanf("%d",&n);
mp.clear();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
if(mp[p[i].x]<p[i].y) mp[p[i].x]=p[i].y;
}

sort(p+1,p+1+n,cmp);
for(int i=1;i<n;i++)
{
if(mp[p[i].x]!=p[i].y) continue;
for(it=mp.find(p[i].x);;it++) //循环开始的位置很重要,若从最开始找相当于没有优化
{
if(it==mp.end())
{
break;
}
if(it->first>=p[i].x && it->second>=p[i].y)
{
if(it->first==p[i].x && it->second==p[i].y) continue;
break;
}
}
if(it==mp.end())
{
printf("(%d,%d),",p[i].x,p[i].y);
}
}
printf("(%d,%d)\n",p
.x,p
.y);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  openjudge 贪心 map 映射
相关文章推荐