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; }