摘要:本文是PTA编程题"爬动的蠕虫"的题解,涵盖题目描述、输入输出格式及C++语言实现,展示模拟循环算法。
题目描述
一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。
输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1输出样例:
11解题思路
- 核心问题分析:蠕虫交替进行上爬(1分钟上升U寸)和休息(1分钟下滑D寸),需要计算爬出井所需的总时间。关键在于:上爬过程中若到达或超过井口即完成,不需要再下滑。
- 算法原理说明:使用模拟法,通过无限循环交替执行上爬和休息两个阶段。每次上爬后立即检查是否爬出,若已爬出则退出循环;否则进入休息阶段下滑。时间在每个阶段分别累加。
- 具体计算步骤:
- 初始化高度height=0,时间time=0
- 进入循环:
- 上爬阶段:time+1,height+U,若height≥N则结束
- 休息阶段:time+1,height-D
- 重复步骤2直到爬出井
- 输出总时间time
代码流程说明
- 引入头文件与命名空间(第1-2行):引入iostream头文件,使用std命名空间。
- 变量声明与输入(第5-7行):定义井深N、上爬距离U、下滑距离D、时间time(初始0)、当前高度height(初始0);读取输入的N、U、D。
- 模拟循环(第9-19行):
- while(1)进入无限循环
- 上爬阶段:time自增1分钟,height增加U寸
- 判断height≥N:若成立则break退出循环(已爬出)
- 休息阶段:time自增1分钟,height减少D寸(下滑)
- 输出与返回(第21-22行):输出总时间time,返回0表示程序正常结束。
代码流程图
解题流程图
代码部分实现
#include<iostream>usingnamespacestd;intmain(void){intN,U,D,time=0,height=0;// N为井深,U为上爬距离,D为下滑距离,time为时间,height为当前高度cin>>N>>U>>D;// 读取井深N、上爬距离U、下滑距离Dwhile(1){// 无限循环,直到蠕虫爬出井time++;// 时间加1分钟height+=U;// 蠕虫上爬U寸if(height>=N){// 判断是否到达或超过井口break;// 爬出井,退出循环}time++;// 休息1分钟,时间加1height-=D;// 休息期间下滑D寸}cout<<time<<endl;// 输出爬出井的总时间return0;}