试题 A: 跑步训练
本题总分:5 分
【问题描述】
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000 。如果小明跑步,每分钟损耗 600的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0 ,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。答案中只填写数,不填写单位。
分析:第1分钟消耗600体力,第2分钟提升300体力,那就每2分钟消耗200体力;只要最后剩下大于600就能完成这样的循环,所以分情况讨论,当剩余体力大于600时,每2分钟消耗300体力;体力小于600时,直接计算当前还能跑多少秒?
喜欢用递归算法,因为代码少
#include <iostream>
using namespace std;
int slove(int n)
{
int m = 0;
while(true)
{
// 体力大于600,还能进行下次循环
if(n > 600)
{
n -= 600; // 跑1分钟消耗600体力
}
else
{
// 600/60 每秒钟消耗的体力
// n / (600 / 60) n体力能够跑的时间
return m + n / (600 / 60);
}
n += 300; // 休息1分钟提升300体力
m = m + 2 * 60; // 一个循环2分钟
}
}
// 递归算法
int slove_d(int n)
{
//体力不大于600,结束递归
if(n <= 600)
{
return n / (600 / 60);
}
// 每次循环2分钟, 消耗300体力
return 60 * 2 + slove_d(n - 300);
}
int main()
{
cout << slove(10000) << endl;
cout << slove_d(10000) << endl;
return 0;
}