top1编程
← 返回题目
题解

吃苹果

1 条题解

  • 0
    @ 2026-8-4 10:00:35

    解题思路

    童童有 m 个苹果,吃一个苹果需要 t 分钟,吃完一个立刻吃下一个。已经过去了 s 分钟,问还剩几个"完整的"苹果。

    先想清楚"吃完几个":s 分钟里,每 t 分钟吃一个,完整吃掉的是 s / t 个(整除)。例如样例 m=50、t=10、s=200:200 / 10 = 20 个吃完,剩下 50 - 20 = 30 个,输出 30。

    但是注意题目问的是"完整的苹果"。如果 s 不是 t 的整数倍,比如 s = 205:吃到第 200 分钟时正好吃完第 20 个,剩下 5 分钟正在吃第 21 个,这个苹果被咬了一口,已经不是完整的了。所以这时候"不完整的苹果"要比 s / t 多算 1 个。

    所以:

    • 如果 s % t == 0(时间正好),不完整的苹果数 = s / t;
    • 如果 s % t != 0(还有零头),不完整的苹果数 = s / t + 1。

    剩下完整的苹果数 = m - 不完整的苹果数。

    最后处理边界:如果时间太长,连 m 个苹果都吃完了,剩下的就是 0 个,不能算成负数。所以算出来如果小于 0,就改成 0。

    理解的时候可以反过来想:先把 s 分钟分成一个个 t 分钟的完整时间段,能分出几个就吃完几个完整的苹果;剩下的零头时间不够吃完下一个,但正在吃的那个苹果已经不算完整的了。

    这个思路和"虫子吃苹果"那题很像,都是"向上取整再加边界保护"。关键是读懂"完整"这两个字:被咬了一口的苹果,不能再算完整的。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int m, t, s;   // m 个苹果,吃一个要 t 分钟,已经过了 s 分钟
        cin >> m >> t >> s;
    
        int eaten;   // 不完整(被吃过的)苹果数量
        if (s % t == 0) {
            eaten = s / t;        // 时间正好,完整吃掉这么多
        } else {
            eaten = s / t + 1;    // 还有零头,正在吃的那个也不完整
        }
    
        int left = m - eaten;   // 剩下的完整苹果数
        if (left < 0) {
            left = 0;   // 苹果吃完了,剩余不能是负数
        }
    
        cout << left << endl;   // 输出剩余苹果数
        return 0;
    }
    

    复杂度分析

    只读入 3 个数,做几次除法和加减法,运算次数固定,和 m、t、s 的大小无关。时间复杂度和空间复杂度都是 O(1)。

    • 1