題目
原文
精靈王子愛好冒險,在一次探險歷程中,他進入了一個神秘的山洞。在洞穴深處,精靈王子不小心觸動了洞穴內(nèi)暗藏的機關(guān),整個洞穴很快塌陷,精靈王子必須晶塊逃離洞穴。精靈王子的跑步速度為17m/s,以這樣的速度可能是無法逃出洞穴的。慶幸的是精靈王子擁有閃爍法術(shù),可在1s內(nèi)移動60m,不過每次使用閃爍法術(shù)都會消耗魔法值10點。精靈王子的魔法值恢復(fù)的速度為4點/s,只有處在原地休息狀態(tài)時才能恢復(fù)。
現(xiàn)在已知精靈王子的魔法初始值M,他所在洞穴中的位置與洞口出口之間的距離S,距離洞穴坍塌的時間T。你的任務(wù)是寫一個程序幫助精靈王子計算如何在最短的時間內(nèi)逃離洞穴。若能逃出,輸出"Yes",并輸出逃出所有的最短時間;若不能逃出,則輸出"No",同時輸出精靈王子在剩下的時間內(nèi)能走的最遠距離。注意字母大小寫。注意:精靈王子跑步、閃爍或休息活動均以秒(s)為單位。且每次活動的持續(xù)時間為整數(shù)秒。距離的單位(m)。
分析
一眼望過去都是密密麻麻的文字,看著很嚇人。沒關(guān)系,我們把對我們有用的信息提煉出來就好了:
- 跑步速度:17m/s,閃爍速度:60m/s
- 閃爍需要消耗10點魔法值,魔法值的恢復(fù)速度為4點/s,恢復(fù)時需要在原地休息
- 秒(s)為原子單位,也就是說不存在零點幾秒
通過分析我們可以得出:
- 如果魔法充足,優(yōu)先使用閃爍
- 如果魔法不足,則分情況考慮(如下表):
- 如果距離 >= 60m且 <= 68m,跑步更劃算
- 如果距離 <= 34m,跑步更劃算
- 其他情況則閃爍更劃算
距離=34,60m時,跑步和閃爍是等效的(都能逃出洞口),為了簡化問題,統(tǒng)一使用跑步。
| 魔法值 | 閃爍 | 跑步 |
|---|---|---|
| 0、1 | (3+1)s - 60m | 4s - 68m |
| 2、3、4、5 | (2+1)s - 60m | 3s - 51m |
| 6、7、8、9 | (1+1)s - 60m | 2s - 34m |
| 1s - 17m |
使用閃爍需要的時間 = 恢復(fù)時間 + 使用時間
參考答案
代碼
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int m, s, t;
Scanner cin = new Scanner(System.in);
m = cin.nextInt();
s = cin.nextInt();
t = cin.nextInt();
Main test = new Main();
test.start(m, s, t);
}
public void start(int m, int s, int t) {
//記錄初始距離
int l = s;
int second = 0;
while (s > 0) {
//如果魔法大于10 就使用魔法
while (m >= 10) {
second++;
if (second > t) {
System.out.println("No " + (l - s));
return;
}
m -= 10;
s -= 60;
if (s <= 0) {
System.out.println("Yes " + second);
return;
}
}
//跑
if (s >= 60 && s <= 68) {
second += 4;
if (second > t) {
System.out.println("No " + (l - s));
return;
}
s -= 17 * 4;
} else if (s <= 34) {
second++;
if (second > t) {
System.out.println("No " + (l - s));
return;
}
s -= 17;
} else {
//休息
int tem = 0;
while (m < 10) {
second++;
//嘗試跑
tem += 17;
if (second >= t) {
System.out.println("No " + ((l - s) + tem));
return;
}
if (tem > s){
System.out.println("Yes " + second);
return;
}
m += 4;
}
}
}
System.out.println("Yes " + second);
}
}