d555

輸入說明 :

每個測資的第一行有一個數字 N ( 1 ≦ N ≦ 50,0000 ),代表接下來有N行, 每行上有兩個數字 x , y ( 0 ≦ X,Y ≦ 100000 ) 分別代表一點的 X 軸座標,與 Y 軸座標。

輸出說明 :

請依照 X 軸的大小,由小輸出至大,剩餘的請參考Sample Out。

先定義一個結構,代表一個點,然後把輸入讀進結構陣列裡面,排序這個陣列,順序是x從大到小,x一樣的話y大的放前面

排序完的第1個點,一定是Dominate point,因為它一定x最大,y也最大

再來找它左邊比它高個點,找到之後,再找比第2個Dominate point左邊,且比它高的點

依序找完整個陣列

#include<stdio.h>
#include<stdlib.h>
struct Point
{
    int x;
    int y;    
};

int cmp(const void * pa,const void *pb)
{
    Point *p1 =(Point *)pa; 
    Point *p2 =(Point *)pb;

    if(p1->x != p2->x)
        return p1->x < p2->x;
    else
        return p1->y < p2->y;
}

int cmpans(const void * pa,const void *pb)
{
    Point *p1 =(Point *)pa; 
    Point *p2 =(Point *)pb;

    return p1->x > p2->x;
}

Point a[500000];

int main()
{
    int N;
    int times=0;

    while(scanf("%d",&N)!=EOF)
    {
        int tempN = N;
        int i=0;
        times++;

        while(tempN--)   
        {
            scanf("%d %d",&a[i].x,&a[i].y);
            i++;
        }

        qsort(a,N,sizeof(Point),cmp);   //先比x在比y大的在前面 

        Point ans[50000];
        int count=1;

        ans[0]=a[0]; 
        int x = a[0].x;
        int y = a[0].y;

        for(i=1;i<N;i++)
        {
            if(a[i].x==x) continue;

            if(a[i].y>y)
            {
                y=a[i].y;
                ans[count]=a[i];
                count++;
            }
        }

        qsort(ans,count,sizeof(Point),cmpans);

        //輸出

        printf("Case %d:\n",times);
        printf("Dominate Point: %d\n",count);

        for(i=0;i<count;i++)
        {
            printf("(%d,%d)\n",ans[i].x,ans[i].y);

        }
    }
    return 0;
}