题意:找出高最大的三角形
思路:有技巧的枚举,先找出离A最远的C点,再枚举B点,证明:点击打开链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
const int MAXN = 510;
struct node{
double x,y;
}p[MAXN];
int n;
double dis(node a,node b,node c){
if (b.x != a.x){
double k = (b.y-a.y)/(b.x-a.x);
return fabs((c.y-a.y)-k*(c.x-a.x))/sqrt(1+k*k);
}
else return fabs(c.x-a.x);
}
double len(node a,node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main(){
int sign;
double Max,t,ans;
while (scanf("%d",&n) != EOF){
ans = 0;
for (int i = 1; i <= n; i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for (int i = 1; i <= n; i++){
Max = 0;
for (int j = 1; j <= n; j++){
if (i == j)
continue;
t = len(p[i],p[j]);
if (t > Max){
Max = t;
sign = j;
}
}
for (int j = 1; j <= n; j++){
if (j == i || j == sign)
continue;
ans = max(dis(p[i],p[j],p[sign]),ans);
ans = max(dis(p[i],p[sign],p[j]),ans);
ans = max(dis(p[sign],p[j],p[i]),ans);
}
}
printf("%.6f\n",ans);
}
return 0;
}