专栏文章
题解:P12144 [蓝桥杯 2025 省 A] 地雷阵
P12144题解参与者 4已保存评论 7
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @miplzo0x
- 此快照首次捕获于
- 2025/12/03 14:11 3 个月前
- 此快照最后确认于
- 2025/12/03 14:11 3 个月前
前言
本文中所有三角函数与角度均采用弧度制(如有特殊情况,会注明)。
感谢大佬 @cserzy 的提醒,我的题解中有一个错误( 一定在 外),现已改正(2025 年 4 月 15 日)。
感谢大佬 @Hanwenhu 的提醒,我的题解中有一个错误( 的计算方法应使用 ,而不是 ),现已改正(2025 年 5 月 5 日)。
我自己发现了我的题解中的一个错误(,而不是 ),现已改正(2025 年 5 月 5 日)。
感谢大佬兼紫名管理员 @chen_zhe 的提醒,我的题解中图片爆了,现已修正(2025 年 10 月 16 日)
感谢大佬 @cserzy 的提醒,我的题解中有一个错误( 一定在 外),现已改正(2025 年 4 月 15 日)。
感谢大佬 @Hanwenhu 的提醒,我的题解中有一个错误( 的计算方法应使用 ,而不是 ),现已改正(2025 年 5 月 5 日)。
我自己发现了我的题解中的一个错误(,而不是 ),现已改正(2025 年 5 月 5 日)。
感谢大佬兼紫名管理员 @chen_zhe 的提醒,我的题解中图片爆了,现已修正(2025 年 10 月 16 日)
题意简述
已知一平面直角坐标系 中的第一象限上有 个点 。其中,若有正整数 ,满足 ,则 。给出 个正整数 ,以 为圆心,半径长为 ,分别作 。问:若从原点 出发,在 (即 (角度制,朝 轴方向)至 (角度制,朝 轴方向))中随机选择一个方向,作一条直线不与任何一个圆相交的概率是多少(保留三位小数)?
题目链接
题目链接
正解思路
第一步
对于每个 ,连接 ,设 。
作 ,则 ,。由勾股定理, 中,。所以,。
因为 ,所以 。又因为 ,所以 。
所以, 在 外。
作 ,则 ,。由勾股定理, 中,。所以,。
因为 ,所以 。又因为 ,所以 。
所以, 在 外。

如图,过 作 的切线 与 ,连接 与 。
下面对图中的情况进行讨论。 注意到此时 挡住的是一部分的直线,所以可以理解为挡住了 的方向。
因为 且 ,所以 与 都是直角三角形。因为 且 ,所以 。进而 。
注意到,,。又因为 ,所以 ,。
所以,此时挡住方向的范围就是 。
但是,其实挡住方向的范围可能有一些并不含在 中,所以正确的答案应该是:。
下面对图中的情况进行讨论。 注意到此时 挡住的是一部分的直线,所以可以理解为挡住了 的方向。
因为 且 ,所以 与 都是直角三角形。因为 且 ,所以 。进而 。
注意到,,。又因为 ,所以 ,。
所以,此时挡住方向的范围就是 。
但是,其实挡住方向的范围可能有一些并不含在 中,所以正确的答案应该是:。
第二步
那么,总共不可行的区间加在一起有多长呢(不能重复)?这也很简单了。只要把这些区间合并一下就好了,我们只要记录最后的区间并在计算过程中统计答案(答案初值为 )。
按照区间的最低限度从小往大排序,然后正序扫描一遍。
按照区间的最低限度从小往大排序,然后正序扫描一遍。
如果目前没有一个区间,则就直接把这个区间赋值为现在的区间。否则,分两种情况讨论:
- 最后的区间的最大限度大于等于这个区间的最小限度:最后的区间的最大限度值为它与这个区间的最大限度的最大值。
- 否则:把答案加上最后的区间的最大限度与最小限度的差,然后把最后的区间赋值为这个区间。
最后,把答案加上最后的区间的最大限度与最小限度的差,并根据这个值推导出最终的概率()。
代码
在放代码之前,先提醒一下:
- 使用
double作为变量类型 - 提前求出 。
#include <bits/stdc++.h>
using namespace std;
int n;
const double pi_2 = asin(1);
const double eps = 1e-8;
double x, y, r, t1, t2, d, ans;
pair<double, double> a[100010], lst;
double Max(double u, double v) {
return (u > v) ? u : v;
}
double Min(double u, double v) {
return (u < v) ? u : v;
}
double Abs(double u) {
return (u < 0) ? (0 - u) : u;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
cout << fixed << setprecision(3);
for(int i = 1; i <= n; i ++) {
cin >> x >> y >> r;
d = sqrt(x * x + y * y);
t1 = atan(y / x);
t2 = asin(r / d);
a[i].first = Max(t1 - t2, 0);
a[i].second = Min(t1 + t2, pi_2);
}
sort(a + 1, a + n + 1);
lst = make_pair(-1, -1);
for(int i = 1; i <= n; i ++) {
if(lst.second >= a[i].first) lst.second = Max(lst.second, a[i].second);
else {
ans += (lst.second - lst.first);
lst = a[i];
}
}
ans += (lst.second - lst.first);
cout << 1 - ans / pi_2;
return 0;
}
提交记录
链接:我的提交记录;
相关推荐
评论
共 7 条评论,欢迎与作者交流。
正在加载评论...