題目
原文
精靈王子愛好冒險,在一次探險歷程中,他進入了一個神秘的山洞。在洞穴深處,精靈王子不小心觸動了洞穴內暗藏的機關,整個洞穴很快塌陷,精靈王子必須晶塊逃離洞穴。精靈王子的跑步速度為17m/s,以這樣的速度可能是無法逃出洞穴的。慶幸的是精靈王子擁有閃爍法術,可在1s內移動60m,不過每次使用閃爍法術都會消耗魔法值10點。精靈王子的魔法值恢復的速度為4點/s,只有處在原地休息狀態時才能恢復。
現在已知精靈王子的魔法初始值M,他所在洞穴中的位置與洞口出口之間的距離S,距離洞穴坍塌的時間T。你的任務是寫一個程序幫助精靈王子計算如何在最短的時間內逃離洞穴。若能逃出,輸出"Yes",并輸出逃出所有的最短時間;若不能逃出,則輸出"No",同時輸出精靈王子在剩下的時間內能走的最遠距離。注意字母大小寫。注意:精靈王子跑步、閃爍或休息活動均以秒(s)為單位。且每次活動的持續時間為整數秒。距離的單位(m)。
分析
一眼望過去都是密密麻麻的文字,看著很嚇人。沒關系,我們把對我們有用的信息提煉出來就好了:
- 跑步速度:17m/s,閃爍速度:60m/s
- 閃爍需要消耗10點魔法值,魔法值的恢復速度為4點/s,恢復時需要在原地休息
- 秒(s)為原子單位,也就是說不存在零點幾秒
通過分析我們可以得出:
- 如果魔法充足,優先使用閃爍
- 如果魔法不足,則分情況考慮(如下表):
- 如果距離 >= 60m且 <= 68m,跑步更劃算
- 如果距離 <= 34m,跑步更劃算
- 其他情況則閃爍更劃算
距離=34,60m時,跑步和閃爍是等效的(都能逃出洞口),為了簡化問題,統一使用跑步。
魔法值 | 閃爍 | 跑步 |
---|---|---|
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 |
使用閃爍需要的時間 = 恢復時間 + 使用時間
參考答案
代碼
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);
}
}