苹果与虫子
2026-06-26 09:38:33
发布于:江苏
核心思路
关键在于理解虫子吃苹果的"排队"特性:
虫子吃完一个才能吃下一个,不是同时吃多个
虫子每 x 小时 吃掉一个苹果
问经过 y 小时 后还剩多少完整苹果
分析过程
虫子吃了多少个苹果?
虫子吃苹果是按"整只"吃的,吃一只需要 x 小时。所以:
在 y 小时内,虫子最多能吃完的苹果数 = y / x(整数除法)
但要注意:如果 y 小时刚好够吃完第 k 只,那第 k 只已经被吃完了,不算"完整"
更准确地说:
虫子开始吃第 1 只:0~x 小时
开始吃第 2 只:x~2x 小时
...
开始吃第 k 只:(k-1)x ~ kx 小时
所以在 y 小时后,已经被吃完的苹果数 = y / x(向下取整)
这里有个细节!
看样例:n=10, x=4, y=9
9 / 4 = 2(整数除法),虫子吃完 2 个
剩余 = 10 - 2 = 8?但样例输出是 7
这说明虫子正在吃第 3 个!第 3 个已经被咬了,不算"完整"的。
正确理解
"完整苹果" = 没被碰过的苹果
0~4小时:吃第1个,吃完
4~8小时:吃第2个,吃完
8~12小时:吃第3个,正在吃(到第9小时还没吃完)
所以:
已吃完:2 个
正在吃:1 个(被咬了,不完整)
剩余完整:10 - 2 - 1 = 7 ✓
公式推导
虫子"祸害"过的苹果总数(包括正在吃的)= ⌈y / x⌉(向上取整)
或者用整数运算:
如果 y % x == 0:刚好吃完 y/x 个,正在吃的那个还没开始
如果 y % x != 0:吃完 y/x 个,还有 1 个正在吃
统一写法:y / x + (y % x != 0 ? 1 : 0),即 (y + x - 1) / x(向上取整)
如果对您有帮助的话点个赞吧~~~[:ACGO_再见]
示例
#include <iostream>
using namespace std;
int main() {
int n, x, y;
cin >> n >> x >> y;
// 虫子正在吃或已经吃完的苹果数(向上取整)
int eaten = (y + x - 1) / x;
// 剩余完整苹果(不能为负数)
int ans = n - eaten;
if (ans < 0) ans = 0;
cout << ans << endl;
return 0;
}
这里空空如也







有帮助,赞一个