ZOJ 3762 Pan's Labyrinth

来源:互联网 发布:java显式与隐式初始化 编辑:程序博客网 时间:2024/05/12 22:34

比赛过程中想到了算法,但是没有敲,事后想到可以直接套模版了...


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define op operator#define cp const Point&using namespace std;const double eps = 1e-8, pi = acos(-1.0);const int N = 505;inline int sig(double x){return (x>eps)-(x<-eps);}inline double sqr(double x){return x*x;}struct Point{    double x,y,ang;    void in(){scanf("%lf%lf",&x,&y);}    Point(){}    Point(double xx,double yy):x(xx),y(yy){}    Point op+(cp a)const{return Point(x+a.x,y+a.y);}    Point op-(cp a)const{return Point(x-a.x,y-a.y);}    double op^(cp a)const{return x*a.y-y*a.x;}    double cross(cp a,cp b){return (a-*this)^(b-*this);}    bool op<(cp a)const{return x<a.x || (x==a.x && y<a.y);}    double angle(){return atan2(y,x)+pi;}    double L(){return sqrt(sqr(x)+sqr(y));}} pnt[N],res[N],rot[N];bool cmp(cp a,cp b){return a.ang<b.ang;}double ptoline(Point p,Point a,Point b){    return fabs(p.cross(a,b))/(a-b).L();}int Graham(Point *p,int n,Point *ch){    sort(p,p+n);    int m=0;    for(int i=0;i<n;++i){        while(m>1 && sig((ch[m-1]-ch[m-2])^(p[i]-ch[m-1]))<0) --m;        ch[m++]=p[i];    }    int k=m;    for(int i=n-2;i>=0;--i){        while(m>k && sig((ch[m-1]-ch[m-2])^(p[i]-ch[m-1]))<0) --m;        ch[m++]=p[i];    }    if(m>1) --m;    return m;}double check(int k,int n,int m){    double ret=0;    int cnt=0;    for(int i=0;i<n;++i){        if(i!=k){            rot[cnt]=pnt[i]-pnt[k];            rot[cnt].ang=rot[cnt].angle();            ++cnt;        }    }    sort(rot,rot+cnt,cmp);    int j=0;    while(1){        if(sig(rot[0]^(res[j]-pnt[k]))>=0 &&           sig(rot[0]^(res[(j+m-1)%m]-pnt[k]))<=0) break;        j=(j+1)%m;    }    for(int i=0;i<cnt;++i){        Point tmp=pnt[k]+rot[i];        while(ptoline(res[j+1],pnt[k],tmp)>ptoline(res[j],pnt[k],tmp) ||              sig(ptoline(res[j],pnt[k],tmp))==0) j=(j+1)%m;        ret=max(ret,ptoline(res[j],pnt[k],tmp));    }    return ret;}int main(){    int n;    while(scanf("%d",&n)!=EOF){        for(int i=0;i<n;++i) pnt[i].in();        int m=Graham(pnt,n,res);        double ans=0;res[n]=res[0];        for(int i=0;i<n;++i)            ans=max(ans,check(i,n,m));        printf("%.10lf\n",ans);    }    return 0;}


0 0
原创粉丝点击