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由小到达输出。注意:输出的每个点之间有”,”分隔,最后一个点之后没有”,”,少输出和多输出都会被判。
【输入样例】
【输出样例】
【样例解释】
样例的点和极大点的图形如下:
【数据范围】
80%的数据满足:n<=6000
100%的数据满足:n<=100000
【来源】
http://noi.openjudge.cn/ch0406/2704/
思路:暴力算法可通过80%数据。然后想到用贪心进行优化,将坐标按横坐标由小到大,横坐标相等时纵坐标由小到大进行排序。另外在输入数据时用map记录在同一横坐标上的最大的纵坐标。(因为对map的使用不是很熟悉,忘记了find函数,因此考试时使用map的时间复杂度与没有优化一样。)
在一个平面上,如果有两个点(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; }
相关文章推荐
- BZOJ - 1609/USACO - Feb08 Silver Eating Together 麻烦的聚餐 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 2
- 复赛模拟试题 - 收费站 Dijkstra迪杰斯特拉+二分答案法 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 4
- OpenJudge - 2989 糖果 动态规划(DP) 重庆一中高2018级竞赛班第十一次测试 2016.9.24 Problem 2
- Vijos - 1488 路灯的改建计划 动态规划 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 3
- OpenJudge - 6683 变幻的矩阵 模拟 重庆一中高2018级竞赛班第十一次测试 2016.9.24 Problem 1
- 旅行 贪心 重庆一中高2018级竞赛班第四次测试 2016.7.25 Problem 2
- POJ - 1328 Radar Installation 安装雷达 贪心+区间选点 重庆一中高2018级竞赛班第八次测试 2016.8.7 Problem 3
- 复赛模拟试题 - 盛夏的果实 SPFA(队列优化)+二分答案法 重庆一中高2018级竞赛班第七次测试 2016.8.4 Problem 4
- OpenJudge2704 寻找平面上的极大点(重庆一中高2018级信息学竞赛测验9) 解题报告
- NOIP 2010 - 普及组 导弹拦截 贪心 重庆一中高2018级竞赛班第三次测试 2016.7.24 Problem 3
- NOIP 2010 - 提高组 引水入城 棋盘上的BFS+区间覆盖(贪心) 重庆一中高2018级竞赛班第十次测试 2016.9.16 Problem 4
- NOIP 2008 - 普及组 排座椅 贪心 重庆一中高2018级竞赛班第五次测试 2016.7.26 Problem 2
- Vijos - 1060 盒子 递推+优化 重庆一中高2018级竞赛班第七次测试 2016.8.4 Problem 1
- POJ - 3069 Saruman's Army 萨鲁曼的大军 贪心 重庆一中高2018级竞赛班第三次测试 2016.7.24 Problem 2
- UVa - 1615 Highway 高速公路 贪心+区间选点 重庆一中高2018级竞赛班第五次测试 2016.7.26 Problem 1
- POJ - 3622/USACO - Dec07 Gold Gourmet Grazers 挑剔的美食家 重庆一中高2018级竞赛班第五次测试 2016.7.26 Problem 4
- NOIP 2010 - 提高组 乌龟棋 动态规划 重庆一中高2018级竞赛班第八次测试 2016.8.7 Problem 2
- Vijos - 1037 搭建双塔 动态规划(DP) 重庆一中高2018级竞赛班第七次测试 2016.8.4 Problem 2
- CQBZOJ - 2935 病毒分裂 分治算法+快速幂 重庆一中高2018级竞赛班第六次测试 2016.7.31 Problem 1
- UVa - 815 Flooded! 洪水 二分猜答案+排序 重庆一中高2018级竞赛班第三次测试 2016.7.24 Problem 1