【题目描述】
在一个平面上,如果有两个点(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)
【提示】
提示:
// Created on 2020/2/12
/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int idata=1000+5;
int n,m;
int flag1,flag2;
bool judge;
ll cnt;
int maxx;
struct node
{
int x;
int y;
bool judge=0;
}node[idata];
int main()
{
int t;
cin>>t;
int i,j;
node[0].x=0,node[0].y=0;
for(i=1;i<=t;i++)
cin>>node[i].x>>node[i].y;
for(i=1;i<=t;i++)
{
for(j=i+1;j<=t;j++)
{
if(node[j].x<node[i].x)
swap(node[i],node[j]);
else if(node[i].x==node[j].x
&&node[i].y>node[j].y)
swap(node[i],node[j]);
}
}
for(i=1;i<=t;i++)
{
for(j=1;j<=t;j++)
{
if(i!=j&&node[j].x>=node[i].x
&&node[j].y>=node[i].y)
{
node[i].judge=1;
}
}
}
for(i=1;i<=t;i++)
{
if(!node[i].judge)
{
cnt++;
if(cnt==1)
printf("(%d,%d)",node[i].x,node[i].y);
else
printf(",(%d,%d)",node[i].x,node[i].y);
}
}
return 0;
}