C/C++ 2020年第十一屆藍橋杯B組第一場---A題---跑步訓練
阿新 • • 發佈:2020-12-26
試題 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; }