1 条题解

  • 0
    @ 2026-5-16 14:34:42

    A. Treasure Hunt 详细题解

    一、问题重述

    小 B 和小 K 轮流挖土。小 B 先手,每天挖 xx 米;小 K 后手,每天挖 yy 米。宝藏埋在地下 a.5a.5 米处(即 a+0.5a + 0.5 米)。问谁会先使总深度超过 a.5a.5 米?

    • 若小 B 先挖到,输出 "NO"
    • 若小 K 先挖到,输出 "YES"

    二、核心思路

    由于每天挖的深度固定,我们可以将每两天(一轮)视为一个周期:

    • 第一天(小 B):挖 xx
    • 第二天(小 K):挖 yy

    一轮的总深度为 x+yx + y 米。

    aa 为整数部分,宝藏深度为 a+0.5a + 0.5
    等价条件:总深度 大于 aa 米(因为 a+0.5>aa + 0.5 > a)。


    三、数学推导

    1. 完整轮数

    先计算完整的两天周期数:

    $$\text{full\_cycles} = \left\lfloor \frac{a}{x + y} \right\rfloor $$

    经过 2×full_cycles2 \times \text{full\_cycles} 天后,总深度为:

    $$\text{total} = \text{full\_cycles} \times (x + y) $$

    此时总深度 a\le a(因为除不尽时余数小于 x+yx+y)。

    2. 剩余深度

    剩余需要挖的深度为:

    r=afull_cycles×(x+y)r = a - \text{full\_cycles} \times (x + y)

    r=amod(x+y)r = a \bmod (x + y)

    3. 判断下一天

    下一轮开始时,小 B 先挖 xx 米:

    • 如果 r<xr < x,则小 B 挖 xx 米后,总深度变为 total+x\text{total} + x
      • 因为 totala\text{total} \le ar<xr < x,所以 total+x>a\text{total} + x > a
      • 即小 B 在第一天就超过 aa 米 → 小 B 先挖到 → 输出 "NO"
    • 如果 rxr \ge x,则小 B 挖 xx 米后总深度 a\le a,还需小 K 挖 yy 米:
      • 小 K 挖 yy 米后总深度 =total+x+y>a= \text{total} + x + y > a(因为 rxr \ge xx+y>rx + y > r?需谨慎)
      • 准确说:小 K 挖完后总深度 =total+x+y= \text{total} + x + y
      • 因为 totala\text{total} \le atotal+xa\text{total} + x \le a(由 rxr \ge x 可得),但 total+x+y=total+(x+y)>a\text{total} + x + y = \text{total} + (x+y) > a(因为 x+y>rx+y > rtotal+r=a\text{total} + r = a
      • 所以小 K 挖完后超过 aa → 小 K 先挖到 → 输出 "YES"

    四、简化结论

    判断条件只需要看 amod(x+y)a \bmod (x + y)xx 的关系:

    $$\text{如果 } a \bmod (x + y) < x \text{,则小 B 先挖到(输出 "NO")} $$否则,小 K 先挖到(输出 "YES")\text{否则,小 K 先挖到(输出 "YES")}

    五、标程代码

    #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:x=1,y=2,a=4x=1, y=2, a=4

    • x+y=3x + y = 3
    • amod3=4mod3=1a \bmod 3 = 4 \bmod 3 = 1
    • 1<x=11 < x = 1?相等,不小于 → 进入 else → 输出 "YES"

    示例 2:x=2,y=1,a=4x=2, y=1, a=4

    • x+y=3x + y = 3
    • 4mod3=14 \bmod 3 = 1
    • 1<21 < 2 → 输出 "NO"

    示例 3:x=2,y=2,a=1x=2, y=2, a=1

    • x+y=4x + y = 4
    • 1mod4=11 \bmod 4 = 1
    • 1<21 < 2 → 输出 "NO"

    七、时间复杂度

    • 每个测试用例 O(1)O(1)
    • 总复杂度 O(t)O(t)t1000t \le 1000,完美通过

    八、总结

    本题的关键在于用取模运算代替模拟

    • 一个完整周期为 x+yx + y
    • 只看余数 amod(x+y)a \bmod (x + y)xx 的关系
    • 不需要浮点数比较(a+0.5a + 0.5 转化为 aa 的整数比较)
    • 1

    信息

    ID
    7096
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者