寻找平面上的极大点

【问题描述】

  在一个平面上,如果有两个点(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;
}

猜你喜欢

转载自blog.csdn.net/qq_35546348/article/details/52495960