1. 程式人生 > 實用技巧 >P1095 守望者的逃離(線性DP)

P1095 守望者的逃離(線性DP)

題目描述

惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領深藏在海底的娜迦族企圖叛變。守望者在與尤迪安的交鋒中遭遇了圍殺,被困在一個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去。到那時,島上的所有人都會遇難。守望者的跑步速度為17m/s17m/s,以這樣的速度是無法逃離荒島的。慶幸的是守望者擁有閃爍法術,可在1s1s內移動60m60m,不過每次使用閃爍法術都會消耗魔法值1010點。守望者的魔法值恢復的速度為44點/s/s,只有處在原地休息狀態時才能恢復。

現在已知守望者的魔法初值MM,他所在的初始位置與島的出口之間的距離SS,島沉沒的時間TT。你的任務是寫一個程式幫助守望者計算如何在最短的時間內逃離荒島,若不能逃出,則輸出守望者在剩下的時間內能走的最遠距離。注意:守望者跑步、閃爍或休息活動均以秒(s)(s)為單位,且每次活動的持續時間為整數秒。距離的單位為米(m)(m)。

輸入格式

共一行,包括空格隔開的三個非負整數M, S, TM,S,T。

輸出格式

共兩行。

11行為字串“YesYes”或“NoNo”(區分大小寫),即守望者是否能逃離荒島。

22行包含一個整數。第一行為“YesYes”(區分大小寫)時表示守望者逃離荒島的最短時間;第一行為“NoNo”(區分大小寫)時表示守望者能走的最遠距離。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
typedef long
long ll; ll dp[maxn]; int main () { int m,s,t; scanf("%d%d%d",&m,&s,&t); for (int i=1;i<=t;i++) { if (m>=10) dp[i]=dp[i-1]+60,m-=10; else dp[i]=dp[i-1],m+=4; } for (int i=1;i<=t;i++) if (dp[i]=max(dp[i],dp[i-1
]+17),dp[i]>=s) return printf("Yes\n%d\n",i),0; printf("No\n%lld\n",dp[t]); }