洞穴逃跑 精靈王子

2021-07-14 18:18:54 字數 1201 閱讀 1819

//精靈王子在乙個快要坍塌的洞穴,他必須盡快逃離。

//他跑步速度為17m/s,以跑步速度無法逃出。

//他擁有閃爍法術,在1s內移動60m,但每次會消耗魔法值10點。魔法值恢復的速度是4點/s,在原地休息才能恢復。

//已知:魔法初始值m,離洞口的距離s,距離洞穴坍塌的時間t。

//若能逃出,輸出「yes」,並輸出逃出所用最短時間;若不能,輸出no,並輸出走的距離。

思路分析:

王子的狀態有以下幾種情形:

1、在魔法值充分(m>=10)的情形下,優先連續閃爍,每秒移動距離是 60/1=60 公尺;

在魔法值不夠充分(m<10)的情形下,應該盡可能考慮原地休息恢復然後閃爍,按m值分三種情形:

2、m>=6,休息1秒後(m增加了4點)閃爍,每秒移動距離是 60/2=30 公尺,比直接跑划算;

3、2<=m<6,休息2秒後閃爍,每秒移動距離是 60/3=20 公尺,比直接跑划算;

4、m<2,休息3秒後閃爍,這樣每秒移動距離是 60/4=15 公尺,比直接跑移動的還少,好像沒什麼價值。

不過閃爍後能至少剩下m>=2,能轉換到3情形,這樣兩次合起來是休息5秒閃爍2次,平均每秒移動

距離是 120/7=17.14,因此,又比直接跑要快。(^_^這種情形比較特殊,只有在剩下距離不少

於120公尺的情況下適應,否則需要拆開來考慮);

5、最後一種情形:選擇直接跑。應在最後一步才選擇。條件是如果剩餘時間無法滿足以上2和3兩種

休息後閃爍的情形,或者距離出口距離小於60公尺時需要在直接跑與休息後閃爍之間比較。

*注意第4種情形非常特別,強調條件,距離必須不少於120公尺,否則不能成立,這應當是考慮時最容

易混淆出錯的地方吧

#include

int main()  

else if (t == 0) 

while ( moved < s && time < t ) 

else if ( m >= 6 && t - time >= 2 && s - moved > 34 ) 

else if ( m >= 2 && t - time >= 3 && s - moved > 51 ) 

else if ( t - time >= 7 && s - moved >= 120 ) 

else 

}if ( moved >= s) 

else

return 0;

}