標籤:華為 編程
洞穴逃生
描述:
精靈王子愛好冒險,在一次探險曆程中,他進入了一個神秘的山洞。在洞穴深處,精靈王子不小心觸動了洞穴內暗藏的機關,整個洞穴將很快塌陷,精靈王子必須儘快逃離洞穴。精靈王子的跑步速度為17m/s,以這樣的速度可能是無法逃出洞穴的。慶幸的是精靈王子擁有閃爍法術,可在1s內移動60m,不過每次使用閃爍法術都會消耗魔法值10點。精靈王子的魔法值恢複的速度為4點/s,只有處在原地休息狀態時才能恢複。
現在已知精靈王子的魔法初值M,他所在洞穴中的位置與洞穴出口之間的距離S,距離洞穴塌陷的時間T。你的任務是寫一個程式協助精靈王子計算如何在最短的時間內逃離洞穴。若能逃出,輸出"Yes",並輸出逃出所用的最短時間;若不能逃出,則輸出"No",同時輸出精靈王子在剩下的時間內能走的最遠距離。注意字母大小寫。注意:精靈王子跑步、閃爍或休息活動均以秒(s)為單位。且每次活動的期間為整數秒。距離的單位為米(m)。
註:M、S、T均是大於等於0的整數。由輸入保證取值合法性,考生不用檢查。
提醒:
如果輸入的S為0,則說明本身已經在出口,輸出應為:Yes 0
如果輸入的T為0(且S不為0),則說明已經沒有時間了,輸出應為:No 0
已耗用時間限制: 無限制
記憶體限制: 無限制
輸入:
輸入格式:
M
S
T
輸出:
輸出格式:
Yes 逃出洞穴所用的最短時間
或
No 在洞穴塌陷前能逃跑的最遠距離
範例輸入:
10
50
5
範例輸出:
Yes 1
以下代碼未提交OJ驗證,歡迎交流指正:
#include <iostream>#include <string>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <queue>using namespace std;int mintime, largestdis;int m,s,t;void dfs(int dis, int m, int time){if (time <= t){largestdis = dis > largestdis?dis:largestdis;}if (dis >= s){mintime = time < mintime?time:mintime;return;}if (m >= 10){dfs(dis+60, m-10, time+1);}else{dfs(dis+17, m, time+1);dfs(dis, m+4, time+1);}}int main() {//int m,s,t;while (cin>>m>>s>>t){mintime = INT_MAX;largestdis = INT_MIN;if(s == 0){cout << "Yes " << 0 << endl;continue;}else if(t ==0 && s != 0){cout << "No " << 0 << endl;continue;}dfs(0,m,0);if (mintime <= t){cout<<"Yes"<<" "<<mintime<<endl;}else cout<<"No"<<" "<<largestdis<<endl;}system("pause");return 0;}