题解
虫子吃苹果
1 条题解
-
0
解题思路
一箱里有 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