有一只蜗牛要爬深度为 h 米的井。
爬行规则:
请问蜗牛需要多少天才能爬出这口井?
一行三个整数 h、u、d(1 ≤ d < u ≤ h ≤ 1000)
一个整数,表示蜗牛爬出井所需的天数
10 3 2
8
(每天净爬升 1 米,第 8 天白天爬 3 米到顶)
5 4 2
2
(第1天4→2,第2天6≥5,成功!)
关键点:白天爬到顶端后,不再滑落
这是最容易错的地方!一定要先爬升→再判断→没到顶才滑落
#include <iostream>
using namespace std;
int main() {
int h, u, d;
cin >> h >> u >> d;
int height = 0; // 当前高度
int day = 0; // 天数
while (true) {
day++; // 新的一天开始
height += u; // 白天向上爬
if (height >= h) { // 检查是否爬到顶端
break; // 爬到了,逃出成功
}
height -= d; // 晚上滑落(每天晚上都滑落!)
}
cout << day << endl;
return 0;
}
每次净爬升 (u-d) 米,循环约 h/(u-d) 次
只需要几个变量存储状态,空间开销恒定
错误1:先滑落再检查,或者检查后还滑落
必须是:爬升 → 检查 → 如果没到顶才滑落!
错误2:最后一天爬到顶了还让它滑落
只要白天爬出去就成功了!break 要放在滑落之前!
错误3:数学公式法容易算错边界
模拟法虽然简单但不容易错,推荐新手使用
思考1:样例1推演:第1天爬到3米,晚上滑到1米,对吗?
(是的!每天净爬升 1 米,第8天白天爬3米到顶)
思考2:如何用数学公式直接计算,不用模拟循环?
公式:ceil((h - u) / (u - d) + 1,(h=10,u=3,d=2 → (10-3)/(3-2)+1 = 7+1 = 8
思考3:如果蜗牛每爬2天就休息1天(只滑落不爬升),怎么实现?