专栏文章

题解:SP12400

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

文章操作

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

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

前置知识

这道题可能涉及到以下内容。

题目分析

这道题的解题思路与数学几何题类似,我们只需要推导出关系式就很好解决了。
下面是一张参考图:
在图中,正方形 CFDECFDE 的边长为 CF=EF=DE=DCCF=EF=DE=DC,Johnny 新扩展的圆半径为 NONO,需要修建的墙壁对应线段 ABAB,而 Johnny 兄弟的圆半径为 OMO'M

计算步骤:

已知正方形边长,根据等腰直角三角形的性质,外接圆半径等于对角线长度的一半:
NO=22×EFNO = \frac{\sqrt{2}}{2} \times EF
根据两点间距离公式可以得出两圆心距离:
OO=(x1x2)2+(y1y2)2|O'O| = \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}
接下来就可以判断两圆是否相交了。
  • 如果两圆心距离大于两圆半径之和(d>r+Rd > r + R),则两圆相离。
  • 如果两圆心距离小于两圆半径之差的绝对值(d<Rrd < |R - r|),则两圆内含。
如果出现以上两种情况,代表两圆不相交,输出 No problem
如果两圆相交,公共弦长度计算公式为:
AB=2×r2a2AB = 2 \times \sqrt{r^2 - a^2}
其中弦心距 aa 可通过余弦定理求得:
a=d2+r2R22da = \frac{d^2 + r^2 - R^2}{2d}
代入后得到最终表达式:
AB=2×r2(d2+r2R22d)2AB = 2 \times \sqrt{r^2 - \left( \frac{d^2 + r^2 - R^2}{2d} \right)^2}
将上述数学推导转化为程序实现就可以完成这道题了。

参考程序

CPP
#include <bits/stdc++.h>
#define int long long
#define Rint register int
#define fast_running ios::sync_with_stdio(false), cin.tie(nullptr)
using namespace std;

signed main() {
    fast_running;
    int T, cnt = 0;
    cin >> T;
    while (T--) {
        ++cnt;
        double x1, x2, y1, y2, l, r;
        cin >> x1 >> y1 >> x2 >> y2 >> r >> l;
        double R = (l * sqrt(2)) / 2.0; // 计算圆的半径:对角线长 / 2
        double d = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); // 计算两圆圆心距离
        if (d >= R + r || d + min(R, r) <= max(R, r)) { // 判断两圆是否相交:如果相离或内含,则无交点
            cout << cnt << ". No problem\n";
        } else {
            double part = (d * d + r * r - R * R) / (2 * d); // 计算弦心距 a = (d^2 + r^2 - R^2) / (2d)
            double ans = 2 * sqrt(r * r - part * part); // 弦长 = 2 * sqrt(r^2 - a^2)
            cout << cnt << ". " << fixed << setprecision(3) << ans << '\n';
        }
    }
    return 0;
}

评论

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

正在加载评论...