1. 程式人生 > >luogu P1095 守望者的逃離

luogu P1095 守望者的逃離

速度 區分大小寫 urn r+ 現在 出口 tdi 是否 style

題目描述

惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領深藏在海底的娜迦族企圖叛變。守望者在與尤迪安的交鋒中遭遇了圍殺,被困在一個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沈下去。到那時,島上的所有人都會遇難。守望者的跑步速度為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”(區分大小寫)時表示守望者能走的最遠距離。

輸入輸出樣例

輸入樣例#1:
【輸入樣例1】
39 200 4
【輸入樣例2】
36 255 10
輸出樣例#1:
【輸出樣例1】
No
197
【輸出樣例2】
Yes
6

說明

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.

dp tapfar描述上次的(休息/閃現)選擇;

#include<cstdio>

int max(int a,int b){if(a>b)return
a;else return b;} int m,s,t; struct data{ int far; int mahu;int tapfar; }dp[300004]; int main() { scanf("%d%d%d",&m,&s,&t); dp[0].mahu=m; int i=0; while(i<t&&dp[i].far<s) { i++; if(dp[i-1].mahu>=10) { dp[i].mahu=dp[i-1].mahu-10; dp[i].tapfar=dp[i-1].tapfar+60; } else { dp[i].mahu=dp[i-1].mahu+4; dp[i].tapfar=dp[i-1].tapfar; } dp[i].far=max(dp[i-1].far+17,dp[i].tapfar); } if(dp[i].far>s) { printf("Yes\n%d",i); return 0; } else { printf("No\n%d",dp[t].far); return 0; } return 0; }

luogu P1095 守望者的逃離