守望者在與尤迪安的交鋒中遭遇了圍殺,被困在一個荒蕪的大島上。
爲了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去。到那時,島上的全部人都會遇難。
守望者的跑步速度爲 \(17m/s\),以這樣的速度是沒法逃離荒島的。慶幸的是守望者擁有閃爍法術,可在 \(1s\) 內移動 \(60m\),不過每次使用閃爍法術都會消耗魔法值 \(10\) 點。守望者的魔法值恢復的速度爲 \(4\) 點每秒,只有處在原地休息狀態時才能恢復。spa
如今已知守望者的魔法初值 \(M\),他所在的初始位置與島的出口之間的距離 \(S\),島沉沒的時間 \(T\)。你的任務是寫一個程序幫助守望者計算如何在最短的時間內逃離荒島,若不能逃出,則輸出守望者在剩下的時間內能走的最遠距離。code
注意:守望者跑步、閃爍或休息活動均以秒爲單位,且每次活動的持續時間爲整數秒。距離的單位爲米。orm
輸入數據共一行三個非負整數,分別表示 \(M\),\(S\),\(T\)。ip
輸出數據共兩行。
第一行一個字符串 \(\text{Yes}\) 或 \(\text{No}\),即守望者是否能逃離荒島。
第二行包含一個整數。第一行爲 \(\text{Yes}\) 時表示守望者逃離荒島的最短期;第一行爲 \(\text{No}\) 時表示守望者能走的最遠距離。字符串
INPUTinput
39 200 4
OUTPUTit
No 197
INPUTio
36 255 10
OUTPUTform
Yes 6
對於 100% 的數據, \(1 \leq T \leq 3*10^5\), \(0 \leq M \leq 10^3\), \(1 \leq S \leq 10^6\)class
首先考慮暴力 DP , 設
\(f(i,j)\) 爲 \(i\) 時刻,剩餘 \(j\) 魔法值所能跑出的最遠距離, 式子就很好頹出
\(f(i,j) = max(f(i-1, j)+17, f(i-1, j+10)+60, f(i-1,j-4))\)
很顯然空間複雜度\(O(TM_{sum})\), 時間複雜度\(O(TM_{sum})\)
而且不能用數據範圍的\(M\)是假的,\(M_{sum}\)其實是\(T*4+M\)級別了
因此暴力炸了
從新再考慮
首先若是魔法值夠多,貪心的先用魔法值跑路
發現若是時間夠長,實際上增長魔法值而後一次爆發是比跑步跑的遠的
可是時間較少或者初始魔法值太多的時候就很差辦
能夠直接模擬,也能夠dp
由於跑步更快的方案必定出如今最後,
因此能夠先嚐試全用魔法值跑一遍dp,再用用走路更新它,
正確性留給讀者思考(~實際上是我懶得證了~)