C/C++ 2020年第十一届蓝桥杯B组第一场---A题---跑步训练

试题 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/111706349