题解
吃苹果
1 条题解
-
0
解题思路
童童有 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