SGU151 解题手记
  2m≤|b-c|或2m≥|b+c|就无解了。
  把A放在原点,AB边放在x轴正半轴上,则B点非常容易得到。设M是BC边中点,则C点可以通过下面的方程解出来:\left\{\begin{array}{lll}x_M^2+y_M^2&=&m\\ x_B^2+y_M^2&=&b^2\\ x_B&=&2x_M-c\\ y_B&=&2y_M\end{array}\right.
  解得: \left\{\begin{array}{lll}x_B&=&{4m^2-b^2-c^2}\over {2c}\\ y_B&=&\sqrt{b^2-x_B^2}\end{array}\right.
  Submit 1: WA on 2。B C两个点输出顺序反了。
  Submit 2: WA on 2。看到两个标程都把三角形退化为线段的情况归为有解而不是无解,很奇怪。查了一下OIBH,发现一个“注意”——此题中三角形的面积可以为0。所以无解条件中要去掉2m=|b-c|或者2m=|b+c|的情况。
  Submit 3: PE on 1。去掉以前乱加的特殊处理。
  Submit 4: PE on 6。加上判断b^2-x_b^2\geq0则可以AC,但很奇怪的是,这一点应该在判断为有解的时候就得到保证了。因为|b-c|\leq2m\leq|a+b|\\\Rightarrow-2bc\leq4m^2-b^2-c^2\leq2bc\\\Rightarrow-b\leq{4m^2-b^2-c^2\over2c}\leq b,从而有b^2-x_b^2\geq0
  Submit 5: AC。
  后记: b^2-x_b^2<0的情况出现于浮点误差,当b^2-x_b^2=0时,会因为浮点误差而造成b^2-x_b^2=-0.000,如果不进行修正,就会PE或者WA了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
 
int main()
{
    double c,b,m,x,y;
    scanf("%lf%lf%lf",&c,&b,&m);
    if (2*m<fabs(c-b) || 2*m>c+b)
        printf("Mission impossible\n");
    else
    {
        x=(4*m*m-c*c-b*b)/c/2;
        y=b*b-x*x>=0?sqrt(b*b-x*x):0;
        printf("%.5lf %.5lf\n%.5lf %.5lf\n%.5lf %.5lf\n",0.0,0.0,c,0.0,x,y);
    }
    return 0;
}