UVA10347 题解

· · 题解

大致题意

分析

三角形的中线有现成的长度公式,式中的 A,B,C 表示长度为 a,b,c 的边的中线长度:

A=\dfrac{1}{2}\sqrt{2b^2+2c^2-a^2} B=\dfrac{1}{2}\sqrt{2b^2+2c^2-a^2} C=\dfrac{1}{2}\sqrt{2b^2+2c^2-a^2}

可化为

解得

a=\frac{2}{3}\sqrt{2B^2+2C^2-A^2}\\ b=\frac{2}{3}\sqrt{2A^2+2C^2-B^2}\\ c=\frac{2}{3}\sqrt{2B^2+2A^2-C^2}\\ \end{cases}

上述表达式中的 A,B,C 是输入文件每一行的三个数,由此即可直接转化为一个关于 a^2,b^2,c^2 的三元一次方程,通过该方程组求解出 a,b,c 的值,使用海伦公式

S=\sqrt{p(p-a)(p-b)(p-c)},p=\dfrac{1}{2}(a+b+c)

即可求解。如果求出的 a^2,b^2,c^2 某一个小于等于 0,即为无解,输出 -1。同样,三角形的基本性质包括三条中线能构成三角形。如果中线长度不满足两边之和大于第三边,也需要输出 -1

需要说明的是:

  1. 多组数据,每组数据输出时必须要带换行符;

代码

#include<cstdio>
#include<cmath>
#include<cstdlib>
double A,B,C,a,b,c,p;
void kernel(void)
{
    if(scanf("%lf%lf%lf",&A,&B,&C)==EOF) exit(0);
    if(2*(B*B+C*C)<=A*A || 2*(C*C+A*A)<=B*B || 2*(A*A+B*B)<=C*C || A+B<=C || B+C<=A || C+A<=B)
    {
        printf("-1.000\n");
        return; 
    }
    a=2.*sqrt(2.*(B*B+C*C)-A*A)/3.;
    b=2.*sqrt(2.*(A*A+C*C)-B*B)/3.;
    c=2.*sqrt(2.*(A*A+B*B)-C*C)/3.;
    p=(a+b+c)/2.;
    printf("%.3lf\n",sqrt(p*(p-a)*(p-b)*(p-c)));
    return;
}
int main()
{
    while(1) kernel();
}