1 条题解
-
0
A. Treasure Hunt 详细题解
一、问题重述
小 B 和小 K 轮流挖土。小 B 先手,每天挖 米;小 K 后手,每天挖 米。宝藏埋在地下 米处(即 米)。问谁会先使总深度超过 米?
- 若小 B 先挖到,输出
"NO" - 若小 K 先挖到,输出
"YES"
二、核心思路
由于每天挖的深度固定,我们可以将每两天(一轮)视为一个周期:
- 第一天(小 B):挖 米
- 第二天(小 K):挖 米
一轮的总深度为 米。
设 为整数部分,宝藏深度为 。
等价条件:总深度 大于 米(因为 )。
三、数学推导
1. 完整轮数
先计算完整的两天周期数:
$$\text{full\_cycles} = \left\lfloor \frac{a}{x + y} \right\rfloor $$经过 天后,总深度为:
$$\text{total} = \text{full\_cycles} \times (x + y) $$此时总深度 (因为除不尽时余数小于 )。
2. 剩余深度
剩余需要挖的深度为:
即 。
3. 判断下一天
下一轮开始时,小 B 先挖 米:
- 如果 ,则小 B 挖 米后,总深度变为 :
- 因为 且 ,所以
- 即小 B 在第一天就超过 米 → 小 B 先挖到 → 输出
"NO"
- 如果 ,则小 B 挖 米后总深度 ,还需小 K 挖 米:
- 小 K 挖 米后总深度 (因为 且 ?需谨慎)
- 准确说:小 K 挖完后总深度
- 因为 ,(由 可得),但 (因为 且 )
- 所以小 K 挖完后超过 → 小 K 先挖到 → 输出
"YES"
四、简化结论
判断条件只需要看 与 的关系:
$$\text{如果 } a \bmod (x + y) < x \text{,则小 B 先挖到(输出 "NO")} $$
五、标程代码
#include <bits/stdc++.h> using namespace std; void solve() { int x, y, a; cin >> x >> y >> a; if (a % (x + y) < x) { cout << "NO\n"; } else { cout << "YES\n"; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t; cin >> t; while (t--) solve(); return 0; }
六、示例验证
示例 1:
- ?相等,不小于 → 进入
else→ 输出"YES"✅
示例 2:
- → 输出
"NO"✅
示例 3:
- → 输出
"NO"✅
七、时间复杂度
- 每个测试用例
- 总复杂度 ,,完美通过
八、总结
本题的关键在于用取模运算代替模拟:
- 一个完整周期为 米
- 只看余数 与 的关系
- 不需要浮点数比较( 转化为 的整数比较)
- 若小 B 先挖到,输出
- 1
信息
- ID
- 7096
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者