top1编程
← 返回题目
题解

虫子吃苹果

1 条题解

  • 0
    @ 2026-8-4 2:01:46

    解题思路

    一箱里有 n 个苹果,混进一条虫子。虫子每 x 小时能吃掉一个苹果,吃完一个才会吃下一个。问经过 y 小时,还有多少个苹果没被虫子吃过。

    关键在理解"虫子吃苹果"的节奏。y 小时里,虫子先完整吃完一个又一个,最后可能还剩一点时间又咬了下一个苹果:

    • 如果 y 正好是 x 的倍数(y % x == 0),虫子完整吃掉 y / x 个苹果;
    • 如果 y 不是 x 的倍数(有余数),说明虫子把下一个苹果也咬了一口,这个被咬的苹果也算"被吃过了",所以吃过的苹果数要再加 1,也就是 y / x + 1。

    例如样例 n=3、x=2、y=1:1 小时不够吃完一个苹果,但虫子已经咬了第一个苹果,所以吃过的苹果是 0 + 1 = 1 个,剩下 3 - 1 = 2 个,和样例输出 2 一致!

    再验证一个例子:n=3、x=2、y=4。4 小时正好是 2 的 2 倍,虫子完整吃掉 4 / 2 = 2 个苹果,剩下 3 - 2 = 1 个,输出 1。

    还有最后一个边界情况:如果吃掉的比 n 还多,说明一箱苹果早就吃完了,剩下的应该是 0 个,不能是负数。所以算完"n - 吃过的数量"之后,如果结果是负数,就把它改成 0。比如 y=10、x=2 时虫子吃掉 5 个,可一箱只有 3 个,剩余就是 0。

    小提醒:"有余数就加一"其实就是数学里的"向上取整"。把"吃完一个再吃下一个"的节奏想明白了,这个加一就很好理解。这个"结果不能小于 0"的保护在以后很多题里都会用到。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int n, x, y;   // n 个苹果,x 小时吃一个,已经过了 y 小时
        cin >> n >> x >> y;
    
        int eaten;   // 被虫子吃过的苹果数量
        if (y % x == 0) {
            eaten = y / x;        // 正好完整吃完这么多
        } else {
            eaten = y / x + 1;    // 有零头,说明下一个苹果也被咬了,算吃过
        }
    
        int left = n - eaten;   // 剩下没被吃过的苹果数
        if (left < 0) {
            left = 0;   // 苹果全被吃完了,剩余不能是负数
        }
    
        cout << left << endl;   // 输出结果
        return 0;
    }
    

    复杂度分析

    程序只做几次加减法和除法,运算次数固定,和 n、x、y 的大小无关。时间复杂度和空间复杂度都是 O(1)。

    • 1