寻找平面上的极大点
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1230
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b;
用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内。
给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点。
编程找出所有的极大点,按照x坐标由小到大,输出极大点的坐标。
本题规定:n不超过100,并且不考虑点的坐标为负数的情况。
【输入】
输入包括两行,第一行是正整数n,表示是点数,第二行包含n个点的坐标,坐标值都是整数,坐标范围从0到100,输入数据中不存在坐标相同的点。
【输出】
按x轴坐标最小到大的顺序输出所有极大点。
输出格式为:(x1,y1),(x2,y2),...(xk,yk)。
注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错。
【输入样例】
5 1 2 2 2 3 1 2 3 1 4
【输出样例】
(1,4),(2,3),(3,1)
【提示】
提示:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; struct node{ int x,y,f; }; node p[105]; bool cmp(node A,node B) { if(A.x==B.x)return A.y<B.y; return A.x<B.x; } int main() { int n; cin>>n; for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y; sort(p+1,p+1+n,cmp); for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(p[j].y>=p[i].y) { p[i].f=1;break; } int i=1; while(p[i].f)i++; printf("(%d,%d)",p[i].x,p[i].y); i++; for(;i<=n;i++) if(!p[i].f)printf(",(%d,%d)",p[i].x,p[i].y); }