NYOJ-253 凸包

 

LK的旅行

时间限制: 2000 ms  |  内存限制: 65535 KB
难度: 5
 
描述
LK最近要去某几个地方旅行,她从地图上计划了几个点,并且用笔点了出来,准备在五一假期去这几个城市旅行。现在希望你找出她点的所有的点中距离最远的两个点的距离是多少。各个景点可以认为是在一个平面上。
 
 
输入
第一行有一个整数0<n<10表示测试数据的组数随后的n组数据中,第一行有一个整数3<m<100000表示有m个旅游景点。随后的m行每行有两个整数,分别表示每一个点的x和y。景点坐标中可能有重复的,0<=x,y<=10000)
输出
每组数据输出距离最远的点对的距离的平方.
样例输入
1

4

0 0

1 1

0 1

1 0
样例输出
2
代码:
#include<iostream>

#include<fstream>

#include<algorithm>

using namespace std;

const int num=100005;

int N;

struct Point

{

    int x;

    int y;

}points[num],output[num];

inline int ccw(Point p1,Point p2,Point p3)           //交叉乘积

{

    return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x);

}

inline int dis(Point p1,Point p2)                         //距离

{

    return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);

}

int cmp(const void *po1,const void *po2)           //排序用的比较函数

{

    Point *p1=(Point *)po1;

    Point *p2=(Point *)po2;

    int temp=ccw(points[0],*p1,*p2);               //先判断方向

    if(temp>0)

    {

        return -1;

    }

    else if(temp<0)

    {

        return 1;

    }

    else

    {

        return dis(*p1,points[0])-dis(*p2,points[0]);   //共线时按距离从大到校排序

    }

}



int maxDist( )

{

    int min_index=0;

    for(int i=1;i<N;i++)

    {

        if(points[i].x<points[min_index].x)

            min_index=i;

        else if(points[i].x<points[min_index].x&&points[i].y<points[min_index].y)

            min_index=i;

    }

    swap(points[0],points[min_index]);               //找到y坐标最小的点,并交换到第一个位置

    qsort(points+1,N-1,sizeof(Point),cmp);         //排序

/*    for(int i=0;i<N;i++)

    {

        printf("%d %d\n",points[i].x,points[i].y);



    }*/

    output[0]=points[0];

    output[1]=points[1];

    int top=1;

    i=2;

    while(i<N)

    {

    //    printf("%d %d\n",points[i].x,points[i].y);



        int temp=ccw(output[top-1],output[top],points[i]);

        if(temp>=0)

        {

            output[++top]=points[i];

            i++;

        }

        /*else if(temp==0)

        {

            output[top]=points[i];

            i++;

        }*/

        else

        {

            top--;

        }

    }

    int maxD=0;

    for( i=0;i<=top;i++)                             //计算边界点之间的距离

    {

    //    printf("%d %d\n",output[i].x,output[i].y);

        for(int j=i+1;j<=top;j++)

        {

            int temp=dis(output[i],output[j]);

            if(temp>maxD)

                maxD=temp;

        }

    }

    printf("%d\n",maxD);

    return maxD;



}



int main()

{

    int T;

    scanf("%d",&T);

    while(T--)           //输入

    {

        scanf("%d",&N);

        for(int i=0;i<N;i++)

        {

            scanf("%d %d",&points[i].x,&points[i].y);

            //printf("%d %d\n",points[i].x,points[i].y);

        }

        maxDist();

    }

    return 0;

}

 

你可能感兴趣的:(OJ)