惡魔獵手尤迫安野心勃勃.他背叛了暗夜精靈,率深藏在海底的那加企圖叛變:守望者在與尤迪安的交鋒中遭遇了圍殺.被困在一個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去,到那時,刀上的所有人都會遇難:守望者的跑步速度,為17m/s, 以這樣的速度是無法逃離荒島的。慶幸的是守望者擁有閃爍法術,可在1s內移動60m,不過每次使用閃爍法術都會消耗魔法值10點。守望者的魔法值恢復的速度為4點/s,只有處在原地休息狀態時才能恢復。
現在已知守望者的魔法初值M,他所在的初始位置與島的出口之間的距離S,島沉沒的時間T。你的任務是寫一個程序幫助守望者計算如何在最短的時間內逃離荒島,若不能逃出,則輸出守望者在剩下的時間內能走的最遠距離。注意:守望者跑步、閃爍或休息活動均以秒(s)為單位。且每次活動的持續時間為整數秒。距離的單位為米(m)。
輸入文件escape.in僅一行,包括空格隔開的三個非負整數M,S,T。
輸出文件escape.out包含兩行:
第1行為字符串"Yes"或"No" (區分大小寫),即守望者是否能逃離荒島。
第2行包含一個整數,第一行為"Yes" (區分大小寫)時表示守望著逃離荒島的最短時間
第一行為"No" (區分大小寫) 時表示守望者能走的最遠距離。
39 200 4Sample Output
No197HINT
30%的數據滿足: 1 <= T<= 10, 1 <=S<= 100
50%的數據滿足: 1 <= T <= 1000, 1 <= S <= 10000
100%的數據滿足: 1 <= T <= 300000, 0 <= M<=1000 1 <=S <= 10^8
Source
NOIP2007
[Submit][Status] #include<iostream>int m,s,t,i,f[300001];using namespace std;int main(){ //freopen("/Users/qigelaodadehongxiaodi/Desktop/data1.txt", "r", stdin); //這個不理,是用來方便輸入輸出的東西,利用文本輸入流來讀取數據 //提交代碼的時候記得注銷這條語句 cin>>m>>s>>t; for(i=1;i<=t;i++) { if(m>=10) { f[i]=f[i-1]+60; m-=10; } else { f[i]=f[i-1]; m+=4; } }//能閃爍就閃爍,不能閃爍就跑 for(i=1;i<=t;i++) { if(f[i]<f[i-1]+17)f[i]=f[i-1]+17; //這里是重點。 //如果這一秒選擇去休息獲取m+4,則你也可以選擇去跑步1s,然后判斷是否已經跑出島嶼了 //如果沒跑出,則繼續下一秒 //為什么不需要減回去呢?因為本來f[i]是保存狂閃爍的而已,下一秒不受上一輪跑與不跑的影響 if(f[i]>=s) { cout<<"Yes"<<endl; cout<<i<<endl; return 0; } } cout<<"No"<<endl; cout<<f[t]<<endl; return 0;}
新聞熱點
疑難解答