🐌 蜗牛爬井 - 算法可视化教学

📋 题目描述

有一只蜗牛要爬深度为 h 米的井。


爬行规则:

  • 每天白天向上爬 u
  • 晚上休息时会向下滑落 d
  • 如果某天白天蜗牛已经爬到或超过了井口,它就成功逃脱,不会再滑落

请问蜗牛需要多少天才能爬出这口井?

📥 输入格式

一行三个整数 h、u、d(1 ≤ d < u ≤ h ≤ 1000)

📤 输出格式

一个整数,表示蜗牛爬出井所需的天数

📊 样例输入 1

10 3 2

📊 样例输出 1

8

(每天净爬升 1 米,第 8 天白天爬 3 米到顶)

📊 样例输入 2

5 4 2

📊 样例输出 2

2

(第1天4→2,第2天6≥5,成功!)

💡 核心思想

⚠️ 一个重要边界

关键点:白天爬到顶端后,不再滑落

这是最容易错的地方!一定要先爬升→再判断→没到顶才滑落

🎯 算法步骤

  1. 初始化:当前高度 = 0,天数 = 0
  2. 新的一天开始,天数 + 1
  3. 白天向上爬 u 米
  4. 检查是否爬到/超过顶端 → 如果是,结束
  5. 晚上滑落 d 米(每天晚上都滑落!
  6. 回到第2步继续

💻 参考代码

#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;
}
速度: 1.2秒
第 0 天
🏁 井口
🐌

📊 状态监控

当前天数
0
当前高度
0
当前高度 + u = 爬升后高度

💡 步骤说明

准备开始:选择样例,观察蜗牛爬井过程

🎯 算法总结

📈 复杂度分析

O(h)
时间复杂度
O(1)
空间复杂度

每次净爬升 (u-d) 米,循环约 h/(u-d) 次
只需要几个变量存储状态,空间开销恒定

📝 解题步骤

  1. 读取输入:h(井深)、u(爬升)、d(滑落)
  2. 初始化变量:当前高度 = 0,天数 = 0
  3. 进入循环:
    • 天数 + 1
    • 高度 += u(白天爬升)
    • 如果高度 ≥ h,跳出循环,输出答案
    • 高度 -= d(晚上滑落)
  4. 输出最终天数

🔬 考点分析

❌ 常见错误

错误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天(只滑落不爬升),怎么实现?

⭐ 考点总结

  • 边界条件处理 - 登顶后不再滑落
  • 循环模拟 - 按天模拟爬升和滑落过程
  • 条件判断顺序 - 先爬升 → 再判断 → 没到顶才滑落
  • 仔细读题 - 不要想当然,题目怎么说就怎么做!