【问题描述】
在一个平面上,如果有两个点(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
先按x坐标排序,从后往前找上升的y的长度
#include<cstdio>
#include<algorithm>
#include<set>
#define maxn 100005
using namespace std;
int n,flag=0;
bool vis[maxn]={0};
struct data
{
int x,y;
}a[maxn];
bool cmp(data a,data b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
void read(int &x)
{
x=0;
bool ok=0;
char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
while((ch>='0'&&ch<='9')||ch=='-')
{
if(ch=='-') ok=1;
else x=x*10+ch-'0';
ch=getchar();
}
if(ok) x=-x;
}
void in()
{
read(n);
for(int i=1;i<=n;i++)
{
read(a[i].x);
read(a[i].y);
}
sort(a+1,a+n+1,cmp);
}
void task()
{
int ans=1,yy=a[n].y;
vis[n]=1;
for(int i=n-1;i>=1;i--)
if(a[i].y>yy) {vis[i]=1;yy=a[i].y;}
for(int i=1;i<=n;i++) if(vis[i])
if(!flag) {printf("(%d,%d)",a[i].x,a[i].y);flag=1;}
else printf(",(%d,%d)",a[i].x,a[i].y);
}
int main()
{
//freopen("point.in","r",stdin);
//freopen("point.out","w",stdout);
in();
task();
return 0;
}