爬动的蠕虫

蠕虫爬井问题求解

题目描述

# T287466 05-29-C03-爬动的蠕虫(L3)

## 题目描述

一只1英寸长的蠕虫在一口深为n英寸的井的底部。每分钟蠕虫可以向上爬u英寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了d英寸。上爬和下滑重复进行。蠕虫需要多长时间才能爬出井?不足一分钟按一分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

## 输入格式

输入数据占一行,为3个正整数n,u,d,其中n是井的深度,u是蠕虫每分钟上爬的距离,d是蠕虫在休息的过程中下滑的距离。

## 输出格式

输出占一行,如果蠕虫能爬出井,则输出一个整数,表示蠕虫爬出井所需的时间(分钟);如果不能爬出井,则输出“The worm cannot climb out of the well.”。

## 输入输出样例 #1

### 输入 #1

```
10 2 1
```

### 输出 #1

```
17
```

## 输入输出样例 #2

### 输入 #2

```
20 1 3
```

### 输出 #2

```
The worm cannot climb out of the well.
```

## 说明/提示

### 数据规模与约定:
对100%的数据,0<n<100,0<d<n,0<u<n。

### 本题出处
本题源自以下教材的编程习题:王桂平, 周祖松, 穆云波, 葛昌威编著. C++趣味编程及算法入门. 北京大学出版社, 2024年出版.

一、明确需求

  • 输入井的深度n、蠕虫每分钟上爬距离u、休息时下滑距离d。
  • 若蠕虫能爬出井,输出所需时间(分钟);若不能,输出 “The worm cannot climb out of the well.”。
  • 蠕虫只要在某次上爬过程中头部到达井口(高度\(\geq n\)),就完成任务。

二、设计思路

  • 特殊情况判断:若\(u \leq d\),蠕虫上爬后下滑,高度无法持续增加,必然爬不出,直接输出对应提示。
  • 模拟爬动过程:当\(u > d\)时,模拟蠕虫 “上爬一分钟 + 休息下滑一分钟” 的循环,直到爬出井口。需记录当前高度与时间,每次上爬后检查是否爬出。

三、代码实现步骤(C++)

步骤 1:引入头文件与命名空间

使用#include<bits/stdc++.h>包含常用标准库,using namespace std;简化输入输出操作(无需每次写std::)。

cpp

运行

#include<bits/stdc++.h>
using namespace std;
步骤 2:编写主函数main

程序从main函数开始执行,所有逻辑在此实现。

cpp

运行

int main() {
    // 后续代码写在这里
    return 0; // 程序正常结束
}
步骤 3:输入数据

读取井深n、上爬距离u、下滑距离d。

cpp

运行

int n, u, d;
cin >> n >> u >> d;
步骤 4:处理爬不出的情况

若\(u \leq d\),直接输出提示并结束程序。

cpp

运行

if (u <= d) {
    cout << "The worm cannot climb out of the well." << endl;
    return 0;
}
步骤 5:模拟爬动过程

定义变量j记录当前高度,te记录时间,循环模拟 “上爬 + 检查 + 下滑” 过程。

cpp

运行

int j = 0, te = 0;
while (true) {
    // 上爬一分钟
    j += u;
    te++;
    // 检查是否爬出
    if (j >= n) {
        cout << te;
        return 0;
    }
    // 休息下滑一分钟
    j -= d;
    te++;
}

四、完整代码

cpp

运行

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n, u, d;
    cin >> n >> u >> d;
    if (u <= d) {
        cout << "The worm cannot climb out of the well." << endl;
        return 0;
    }
    int j = 0, te = 0;
    while (true) {
        j += u;
        te++;
        if (j >= n) {
            cout << te;
            return 0;
        }
        j -= d;
        te++;
    }
    return 0;
}

五、测试示例

测试 1:能爬出

输入:

plaintext

10 2 1

模拟过程(关键步骤):

  • 多次 “上爬2→下滑1” 后,第17分钟上爬时,高度达到10,输出17,与样例一致。

测试 2:爬不出

输入:

plaintext

20 1 3

因\(u=1 \leq d=3\),直接输出 “The worm cannot climb out of the well.”,与样例一致。

大家还可以在我的bilibili(编程题小白日记)搜索 ···0052.爬动的蠕虫··· 找到这道题的视频解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值