专栏文章

题解:UVA11437 Triangle Fun

UVA11437题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miozpjjk
此快照首次捕获于
2025/12/03 03:47
3 个月前
此快照最后确认于
2025/12/03 03:47
3 个月前
查看原文

现在开始上数学课

这是一道初中难度的平面几何题,关键就在于求出 SABCS_{\triangle ABC}SPQRS_{\triangle PQR} 的比。

前置知识行列式法求三角形面积,即已知三角形 33 个顶点坐标求三角形面积的方法,其相较于海伦公式的优点为无需计算三条边长。具体地,已知三角形三个顶点分别为 A(x1,y1)A(x_1,y_1)B(x2,y2)B(x_2,y_2)C(x3,y3)C(x_3,y_3),则面积公式为:
SABC=12x1(y2y3)+x2(y3y1)+x3(y1y2)S_{\triangle ABC} = \frac{1}{2} \left| x_1(y_2 - y_3) + x_2(y_3 - y_1) + x_3(y_1 - y_2) \right|
具体证法可参考这篇文章。如果搞不懂行列式法的,用海伦公式或直接作垂/建系也行。

由于本蒟蒻懒得去用几何方法证明,于是决定采用建系暴算的方式证明 SABCS_{\triangle ABC}SPQRS_{\triangle PQR} 的关系。
证法如下:

1. 建立坐标系

为了简化计算(其实简化了也一点都不简单),设:
A(0,0)A(0, 0)
B(b,0)(b>0)B(b, 0)(b > 0)
C(c1,c2)(c2>0)C(c_1, c_2)(c_2 > 0)

2. 确定 DDEEFF 的坐标

  • DDBCBC 的三等分点,BC=3BDBC = 3BD,即 BD:DC=1:2BD : DC = 1 : 2,则
    D=B+13(CB)=(b+c1b3,0+c23)=(2b+c13,c23)D = B + \frac{1}{3}(C - B) = \left( b + \frac{c_1 - b}{3}, 0 + \frac{c_2}{3} \right) = \left( \frac{2b + c_1}{3}, \frac{c_2}{3} \right)
  • 同理
    E=A+23(CA)=(2c13,2c23)E = A + \frac{2}{3}(C - A) = \left( \frac{2c_1}{3}, \frac{2c_2}{3} \right)
    F=A+13(BA)=(b3,0)F = A + \frac{1}{3}(B - A) = \left( \frac{b}{3}, 0 \right)

3. 求直线 ADADBEBECFCF 的方程

  • 直线 ADAD
    • 斜率: kAD=c2302b+c130=c22b+c1k_{AD} = \frac{\frac{c_2}{3} - 0}{\frac{2b + c_1}{3} - 0} = \frac{c_2}{2b + c_1}
    • 方程: yAD=c22b+c1xy_{AD} = \frac{c_2}{2b + c_1} x
  • 同理
    yBE=2c22c13b(xb)y_{BE} = \frac{2c_2}{2c_1 - 3b}(x - b)
    yCF=3c23c1b(xc1)+c2y_{CF} = \frac{3c_2}{3c_1 - b}(x - c_1) + c_2

4. 求交点 PPQQRR

  • 交点 PPADBEAD \cap BE
    • 联立 ADADBEBE 的方程:
      c22b+c1x=2c22c13b(xb)\frac{c_2}{2b + c_1} x = \frac{2c_2}{2c_1 - 3b}(x - b)
      消去 c2c_2c20c_2 \neq 0):
      x2b+c1=2(xb)2c13b\frac{x}{2b + c_1} = \frac{2(x - b)}{2c_1 - 3b} 交叉相乘:
      x(2c13b)=2(xb)(2b+c1)x(2c_1 - 3b) = 2(x - b)(2b + c_1)
      展开并整理:
      2c1x3bx=2(2bx+c1x2b2bc1)2c_1 x - 3b x = 2(2b x + c_1 x - 2b^2 - b c_1)
      2c1x3bx=4bx+2c1x4b22bc12c_1 x - 3b x = 4b x + 2c_1 x - 4b^2 - 2b c_1
      移项:
      3bx4bx=4b22bc1-3b x - 4b x = -4b^2 - 2b c_1
      7bx=2b(2b+c1)-7b x = -2b(2b + c_1) 解得:
      x=2(2b+c1)7,y=c22b+c12(2b+c1)7=2c27x = \frac{2(2b + c_1)}{7}, \quad y = \frac{c_2}{2b + c_1} \cdot \frac{2(2b + c_1)}{7} = \frac{2c_2}{7}
      因此:
      P(2(2b+c1)7,2c27)P\left( \frac{2(2b + c_1)}{7}, \frac{2c_2}{7} \right)
  • 同理可得
    Q(4c1+b7,4c27)Q\left( \frac{4c_1 + b}{7}, \frac{4c_2}{7} \right)
    R(2b+c17,c27)R\left( \frac{2b + c_1}{7}, \frac{c_2}{7} \right)

5. 计算三角形 PQRPQR 的面积

  • 已知:
    P(4b+2c17,2c27),Q(4c1+b7,4c27),R(2b+c17,c27)P\left( \frac{4b + 2c_1}{7}, \frac{2c_2}{7} \right), \quad Q\left( \frac{4c_1 + b}{7}, \frac{4c_2}{7} \right), \quad R\left( \frac{2b + c_1}{7}, \frac{c_2}{7} \right)
    利用行列式公式计算面积:
    SPQR=12xP(yQyR)+xQ(yRyP)+xR(yPyQ)S_{\triangle PQR} = \frac{1}{2} \left| x_P(y_Q - y_R) + x_Q(y_R - y_P) + x_R(y_P - y_Q) \right|
    计算各项:
    yQyR=4c27c27=3c27y_Q - y_R = \frac{4c_2}{7} - \frac{c_2}{7} = \frac{3c_2}{7}
    yRyP=c272c27=c27y_R - y_P = \frac{c_2}{7} - \frac{2c_2}{7} = -\frac{c_2}{7}
    yPyQ=2c274c27=2c27y_P - y_Q = \frac{2c_2}{7} - \frac{4c_2}{7} = -\frac{2c_2}{7}
    代入:
    SPQR=124b+2c173c27+4c1+b7(c27)+2b+c17(2c27)=c2987b+0=c2987b=bc214S_{\triangle PQR} = \frac{1}{2} \left| \frac{4b + 2c_1}{7} \cdot \frac{3c_2}{7} + \frac{4c_1 + b}{7} \cdot \left(-\frac{c_2}{7}\right) + \frac{2b + c_1}{7} \cdot \left(-\frac{2c_2}{7}\right) \right| = \frac{c_2}{98} \left| 7b + 0 \right| = \frac{c_2}{98} \cdot 7b = \frac{b c_2}{14}

6. 计算三角形 ABCABC 的面积

SABC=12×b×c2=bc22S_{\triangle ABC} = \frac{1}{2} \times b \times c_2 = \frac{b c_2}{2}

7. 求面积比

SABCSPQR=bc22bc214=7\frac{S_{\triangle ABC}}{S_{\triangle PQR}} = \frac{\frac{b c_2}{2}}{\frac{b c_2}{14}} = 7

由此可得 SPQR=17SABCS_{\triangle PQR} = \frac{1}{7} S_{\triangle ABC}

于是我们只要求出 SABCS_{\triangle ABC} 再除以 77 即可。

代码

CPP
#include <bits/stdc++.h>
using namespace std;

double cal(double x1, double y1, double x2, double y2, double x3, double y3) // 使用行列式计算三角形面积
{
    return 0.5 * abs((x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1));
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        double a, b, c, d, e, f;
        cin >> a >> b >> c >> d >> e >> f;
        double s = cal(a, b, c, d, e, f) / 7;
        printf("%.0lf\n", s); // 记得保留整数
    }
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...