ZOJ 3762 Pan's Labyrinth 计算几何

题意:给出一系列的坐标,要求出这些坐标中组成的三角形中最大的高是多少

下列两个假设必然有一个成立

1.点C是所有点中距离点A最远的

2.点C是所有点中距离点B最远的

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
struct point
{
    double x,y;
}p[505];
int d[505];
double dist(int i,int j)
{
    return hypot(fabs(p[i].x-p[j].x),fabs(p[i].y-p[j].y));
}
double solve(int i,int j,int k)
{
    double a=dist(i,j),b=dist(i,k),c=dist(j,k);
    double p=(a+b+c)/2;
    double s=sqrt(p*(p-a)*(p-b)*(p-c));
    a=min(a,b);
    a=min(a,c);
    return 2*s/a;
}
int main()
{
    int i,j,k,m,n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(d,0,sizeof(d));
        double ans=0;
        for(i=0;i<n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);

        for(i=0;i<n;i++)
        {
            double maxx=0;
            for(j=0;j<n;j++)
            {
                if(i==j) continue;
                if(dist(i,j)>maxx)
                {
                    maxx=dist(i,j);
                    d[i]=j;
                }
            }
        }
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                if(d[i]==j||d[j]==i) continue;
                ans=max(ans,solve(i,j,d[i]));
                ans=max(ans,solve(i,j,d[j]));
            }
        }
        printf("%.6f\n",ans);
    }
    return 0;
}

 

posted on 2016-02-27 18:30  13rj1115  阅读(162)  评论(0编辑  收藏  举报

导航