COJN 0485 800503寻找平面上的极大点

800503寻找平面上的极大点
难度级别:C; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述
在一个平面上,如果有两个点(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)
注意:输出的每个点之间有","分隔,最后一个点之后没有",",少输出和多输出都会被判错
输入示例

1 2 2 2 3 1 2 3 1 4
输出示例
(1,4),(2,3),(3,1)
其他说明
 
 

题解:奇妙的题。。。窝萌按x,y做一遍全排序,从最右上的点开始扫描y就行,充分利用好单调性就行。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<queue>
 6 #include<cstring>
 7 #define PAU putchar(' ')
 8 #define ENT putchar('
')
 9 using namespace std;
10 const int maxn=100+10,inf=-1u>>1;
11 struct P{int x,y;bool operator<(const P&b)const{return x<b.x||(x==b.x&&y<b.y);}}p[maxn];
12 inline int read(){
13     int x=0,sig=1;char ch=getchar();
14     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
15     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
16     return sig?x:-x;
17 }
18 inline void write(int x){
19     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
20     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
21     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
22 }
23 int n;
24 void init(){
25     n=read();
26     for(int i=0;i<n;i++){
27         p[i].x=read();p[i].y=read();
28     }
29     return;
30 }
31 int cnt=0,ans[maxn];
32 void work(){
33     sort(p,p+n);int mx=-inf;
34     for(int i=n-1;i>=0;i--){
35         if(p[i].y>mx)mx=p[i].y,ans[cnt++]=i;
36     }
37     printf("(%d,%d)",p[ans[cnt-1]].x,p[ans[cnt-1]].y);
38     for(int i=cnt-2;i>=0;i--){
39         printf(",(%d,%d)",p[ans[i]].x,p[ans[i]].y);
40     }
41     return;
42 }
43 void print(){
44     return;
45 }
46 int main(){init();work();print();return 0;}
原文地址:https://www.cnblogs.com/chxer/p/4675429.html