//精靈王子在乙個快要坍塌的洞穴,他必須盡快逃離。
//他跑步速度為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;
}