1. 程式人生 > 其它 >C/C++ 2020年第十一屆藍橋杯B組第一場---A題---跑步訓練

C/C++ 2020年第十一屆藍橋杯B組第一場---A題---跑步訓練

技術標籤:C/C++程式藍橋c++

試題 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;
}