专栏文章

题解:P10410 「QFOI R2」寺秋山霭苍苍

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

文章操作

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

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

前言

我是用的是高中方法。

前置知识

  • 勾股定理。
  • 海伦公式。
  • 定比分点公式。

勾股定理

(x1,y1),(x2,y2)(x_1,y_1),(x_2,y_2) 之间的距离为 (x1x2)2+(y1y2)2\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

海伦公式

若三角形三边长为 a,b,ca,b,c,设半周长 p=a+b+c2p=\frac{a+b+c}{2},则三角形面积为 S=p(pa)(pb)(pc)S=\sqrt{p(p-a)(p-b)(p-c)}

定比分点

若有两点 A(x1,y1),B(x2,y2)A(x_1,y_1),B(x_2,y_2),让求一点 P(x,y)P(x,y) 使得 APPB=k\frac{AP}{PB}=k,则 x=1k+1×x1+kk+1×x2x=\frac{1}{k+1} \times x_1 + \frac{k}{k+1} \times x_2y=1k+1×y1+kk+1×y2y=\frac{1}{k+1} \times y_1 + \frac{k}{k+1} \times y_2

思路

枚举 pp,因为误差不到 10410^{-4} 就算对,所以我们可以每次枚举 pp 增加 10610^{-6},注意题目的 0l,r10 \le l,r \le 1,不会超时。(也可以每次枚举pp增加更少。)
对于每个 pp,先用定比分点算出每个点的坐标,再用勾股定理算出每两个点的个距离,最后用海伦公式算出面积。

注意

我给的定比分点不能直接计算本题,需要一点分析:
AFAB=k\frac{AF}{AB}=k 能推出 AD:DB=k:1kAD:DB=k:1-k,设 A(x1,y1),B(x2,y2)A(x_1,y_1),B(x_2,y_2),则由定比分点,F(kx2+(1k)x1,ky2+(1k)y1)F(kx_2+(1-k)x_1,ky_2+(1-k)y_1),这样才能解出这道题。

AC code

CPP
#include <bits/stdc++.h>

const double eps = 1e-6//eps是误差,此题误差不到1e-4就算对,所以每次+1e-6就能过
using namespace std;

double ans = 1e9;

double gou_gu(double x1, double y1, double x2, double y2) {//勾股定理
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
double hai_lun(double x, double y, double z) {//海伦公式,x,y,z为长度
    double p = (x + y + z) / 2;
    return sqrt(p * (p - x) * (p - y) * (p - z));
}
int main() {
    double l, r, x1, y1, x2, y2, x3, y3;//如果定义为全局变量会报错
    cin >> l>> r>> x1>> y1>> x2>> y2>> x3>> y3;
    for (double p = l; p <= r; p += eps) {
        double x_1 = p * x2 + (1 - p) * x1, y_1 =  p * y2 + (1 - p) * y1;
        double x_2 = p * x3 + (1 - p) * x2, y_2 =  p * y3 + (1 - p) * y2;
        double x_3 = p * x1 + (1 - p) * x3, y_3 =  p * y1 + (1 - p) * y3;//上面推导的公式
        double a = gou_gu(x_1, y_1, x_2, y_2);
        double b = gou_gu(x_2, y_2, x_3, y_3);
        double c = gou_gu(x_3, y_3, x_1, y_1);
        ans = min(ans, hai_lun(a, b, c));//输出让我们输出最小就取最小值
    }
    cout << fixed << setprecision(12)<< ans;//setprecision里的数可以是其他的(注意精度)
    return 0;
}

评论

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

正在加载评论...