題目
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領(lǐng)深藏在海底的娜迦族企圖叛變。守望者在與尤迪安的交鋒中遭遇了圍殺,被困在一個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去。到那時,島上的所有人都會遇難。守望者的跑步速度為17m/s,以這樣的速度是無法逃離荒島的。慶幸的是守望者擁有閃爍法術(shù),可在1s內(nèi)移動60m,不過每次使用閃爍法術(shù)都會消耗魔法值10點。守望者的魔法值恢復(fù)的速度為4點/s,只有處在原地休息狀態(tài)時才能恢復(fù)。
現(xiàn)在已知守望者的魔法初值M,他所在的初始位置與島的出口之間的距離S,島沉沒的時間T。你的任務(wù)是寫一個程序幫助守望者計算如何在最短的時間內(nèi)逃離荒島,若不能逃出,則輸出守望者在剩下的時間內(nèi)能走的最遠距離。注意:守望者跑步、閃爍或休息活動均以秒(s)為單位,且每次活動的持續(xù)時間為整數(shù)秒。距離的單位為米(m)。
Input
輸入包含多個測試數(shù)據(jù),每個測試數(shù)據(jù)僅一行,包括空格隔開的三個非負整數(shù)M, S, T。 1 <= T <= 300000, 0 <= M <= 1000, 1 <= S <= 108.
Output
對每個測試數(shù)據(jù)輸出兩行:
第1行為字符串"Yes"或"No"(區(qū)分大小寫),即守望者是否能逃離荒島。
第2行包含一個整數(shù)。第一行為"Yes"(區(qū)分大小寫)時表示守望者逃離荒島的最短時間;第一行為"No"(區(qū)分大小寫)時表示守望者能走的最遠距離。
相鄰兩個測試數(shù)據(jù)間用一個空行隔開。
Sample Input
39 200 4
36 255 10
Sample Output
No
197
Yes
6
基本思路
根據(jù)特定的魔法值、路程和體力來制定該狀態(tài)的最優(yōu)行動策略,所以要考慮的情況比較多。
代碼
// Copyright (c) 2014 Junjie_Huang@SYSU(SNO:13331087). All Rights Reserved.
// 1484.c: http://soj.sysu.edu.cn/1484
#include <stdio.h>
int main() {
int m, s, t, T, S, f = 0;
while (scanf("%d %d %d", &m, &s, &t) != EOF) {
if (f) printf("\n");
T = t;
S = s;
while (m / 10 >= 1 && t >= 1) {
m = m - 10;
s = s - 60;
t--;
}
while (m < 10 && t >= 1) {
if (m == 0 && s > 102 && t >= 7) {
t = t - 7;
s = s - 120;
}
if (m == 1 && s > 102 && t >= 7) {
t = t - 7;
s = s - 120;
}
if (m == 2 && s > 34 && t >= 3) {
t = t - 3;
s = s - 60;
m = 0;
}
if (m == 3 && s > 34 && t >= 3) {
t = t - 3;
s = s - 60;
m = 1;
}
if (m == 4 && s > 34 && t >= 3) {
t = t - 3;
s = s - 60;
m = 2;
}
if (m == 5 && s > 34 && t >= 3) {
t = t - 3;
s = s - 60;
m = 3;
}
if (m == 6 && s > 17 && t >= 2) {
t = t - 2;
s = s - 60;
m = 0;
}
if (m == 7 && s > 17 && t >= 2) {
t = t - 2;
s = s - 60;
m = 1;
}
if (m == 8 && s > 17 && t >= 2) {
t = t - 2;
s = s - 60;
m = 2;
}
if (m == 9 && s > 17 && t >= 2) {
t = t - 2;
s = s - 60;
m = 3;
}
if (m == 0 && (s <= 102 || t < 7)) break;
if (m == 1 && (s <= 102 || t < 7)) break;
if (m == 2 && (s <= 34 || t < 3)) break;
if (m == 3 && (s <= 34 || t < 3)) break;
if (m == 4 && (s <= 34 || t < 3)) break;
if (m == 5 && (s <= 34 || t < 3)) break;
if (m == 6 && (s <= 17 || t < 2)) break;
if (m == 7 && (s <= 17 || t < 2)) break;
if (m == 8 && (s <= 17 || t < 2)) break;
if (m == 9 && (s <= 17 || t < 2)) break;
}
while (t >= 1 && s > 0) {
s = s - 17;
t = t - 1;
}
if (s > 0) printf("No\n%d\n", S - s);
else printf("Yes\n%d\n", T - t);
f = 1;
}
return 0;
}