1 条题解
-
0
自动搬运
来自洛谷,原作者为

rui_er
九万里风鹏正举搬运于
2025-08-24 22:57:42,当前版本为作者最后更新于2024-04-05 16:00:33,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
考查内容:
- 【1】代数(初中部分)。
- 【1】几何(初中部分)。
- 【3】平方根函数。
本文将介绍两种较为简单的方法。
方法一
容易由海伦公式计算出 。
根据三角形面积公式 , 与 有相同的高,且底边长度之比 ,因此 $\frac{S_{\triangle\textrm{AFC}}}{S_{\triangle\textrm{ABC}}}=p$。同理,$\frac{S_{\triangle\textrm{AFE}}}{S_{\triangle\textrm{AFC}}}=1-p$,即得 $S_{\triangle\textrm{AFE}}=p(1-p)S_{\triangle\textrm{ABC}}$。同理可证 $S_{\triangle\textrm{AFE}}=S_{\triangle\textrm{FBD}}=S_{\triangle\textrm{EDC}}=p(1-p)S_{\triangle\textrm{ABC}}$。
用割补法可以得到 $S_{\triangle\textrm{DEF}}=S_{\triangle\textrm{ABC}}-3p(1-p)S_{\triangle\textrm{ABC}}$。至此,初中几何部分结束。
注意到 是关于 的开口向上的二次函数,对称轴为 。因此,若 ,取 最优;否则取 为更靠近 的区间端点最优。至此,初中代数部分结束。
inline double calc(double S, double p) { return S - 3.0 * (S * p * (1.0 - p)); } double l, r, x1, y1, x2, y2, x3, y3; cin >> l >> r >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; double a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); double b = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)); double c = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); double p = (a + b + c) * 0.5; double S = sqrt(p * (p - a) * (p - b) * (p - c)); double k = 0.5; k = min(k, r); k = max(k, l); cout << fixed << setprecision(12) << calc(S, k) << endl;方法二
令 以一定的精度遍历 ,也就是说枚举 ( 为非负整数),使用定比分点公式计算出 的坐标,使用海伦公式计算出 ,再取得到的所有结果中最小的。
根据方法一中的证明,精度 取 就足以通过本题,取 等其他精度也可。
const double eps = 1e-9; inline double calc(double x1, double y1, double x2, double y2, double x3, double y3) { double a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); double b = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)); double c = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); double p = (a + b + c) * 0.5; double S = sqrt(p * (p - a) * (p - b) * (p - c)); return S; } double l, r, x1, y1, x2, y2, x3, y3; cin >> l >> r >> x1 >> y1 >> x2 >> y2 >> x3 >> y3; double S = 1e100; for(double k = l; k <= r + eps; k += 0.01) { double x4 = x1 + (x2 - x1) * k; double y4 = y1 + (y2 - y1) * k; double x5 = x2 + (x3 - x2) * k; double y5 = y2 + (y3 - y2) * k; double x6 = x3 + (x1 - x3) * k; double y6 = y3 + (y1 - y3) * k; chkmin(S, calc(x4, y4, x5, y5, x6, y6)); } cout << fixed << setprecision(12) << S << endl;
- 1
信息
- ID
- 9995
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者