这个题有公式。 用公式提交AC之后 才知道 是根据海伦公式推出来的。
设三边为 abc 三高为 mnp 则S = am/2 = bn/2 = cp/2
则 a = 2s/m b = 2s/n c = 2s/p
海伦公式 S = sqrt(p*(p-a)*(p-b)*(p-c)); p = (a+b+c)/2 带进去就求出来了
(1)
三角形存在的条件:
中大高的倒数和>小高的倒数
(2)面积公式:
1/S
=√[(1/m+1/n+1/p)(-
1/m+1/n+1/p
)(
1/m-1/n+1/p
)(
1/m+1/n-1/p
)]
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
int main (){
int kase;
scanf("%d",&kase);
while(kase){
double mm,nn,pp;
double m,n,p;
scanf("%lf%lf%lf",&mm,&nn,&pp);
p = max(mm,nn);
p = max(p, pp);
m = min(mm,nn);
m = min(m, pp);
n = (mm + nn + pp) - m - p; // m n p 是递增的
if(1/n + 1/ p <= 1/m){
printf("These are invalid inputs!\n");
kase--;
}
else{
double s = sqrt((1/m+1/n+1/p)*(-1/m+1/n+1/p)*(1/m-1/n+1/p)*(1/m+1/n-1/p));
s = 1/s;
printf("%.3lf\n",s);
}
}
return 0;
}