POJ_2187_Beauty Contest(凸包+暴力)

来源:互联网 发布:淘宝打折app哪个好 编辑:程序博客网 时间:2024/06/05 22:57

题型:计算几何


题意:有n个点,求出这些点中最远的两个点的距离的平方。


分析:

       最远的两个点一定在凸包上,所以先求出凸包,然后找点的时候最坏情况下复杂度为O(n^2),好在数据没有这么恶心,所以暴力也能AC。


代码:

#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>#include<iostream>using namespace std;int n;struct point{    int x,y;}pnt[60000],res[60000];bool mult(point sp,point ep,point op){    return (sp.x-op.x)*(ep.y-op.y)>=(ep.x-op.x)*(sp.y-op.y);}bool operator < (const point &l,const point &r){    return l.y<r.y || (l.y==r.y && l.x<r.x);}int graham(){    int i,len,k=0,top=1;    sort(pnt,pnt+n);    if(n==0) return 0; res[0] = pnt[0];    if(n==1) return 1; res[1] = pnt[1];    if(n==2) return 2; res[2] = pnt[2];    for(i=2;i<n;i++){        while(top && mult(pnt[i],res[top],res[top-1])) top--;        res[++top] = pnt[i];    }    len=top; res[++top] = pnt[n-2];    for(i=n-3;i>=0;i--){        while(top!=len && mult(pnt[i],res[top],res[top-1]))            top--;        res[++top] = pnt[i];    }    return top;}int dis(point a,point b){    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}int main(){    while(~scanf("%d",&n)){        int MAXN=0;        for(int i=0;i<n;i++){            scanf("%d%d",&pnt[i].x,&pnt[i].y);        }        int top=graham();        for(int i=0;i<top;i++){            for(int j=0;j<top;j++){                if(i==j) continue;                MAXN = max(MAXN,dis(res[i],res[j]));            }        }        printf("%d\n",MAXN);    }    return 0;}


原创粉丝点击