守望者的逃離(動態規劃)

2021-08-14 07:20:25 字數 1458 閱讀 7850

惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領深藏在海底的娜迦族企圖叛變。守望者在與尤迪安的交鋒中遭遇了圍殺,被困在乙個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去。到那時,島上的所有人都會遇難。守望者的跑步速度為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】39 200 4【輸入樣例2】36 255 10

【輸出樣例1】no197【輸出樣例2】yes6

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,做一下找找自信,,首先動規先要劃分狀態,但這道題的狀態只有時間,,所以我們用f[i]儲存時刻i走了多遠

然後是每一種狀態的決策,有三種:跑,閃現,回藍

閃現耗藍和跑在一起算會很麻煩,於是我們可以將兩者分開,算閃現,for(int i=1;i<=t;i++)

如果藍足夠就閃現耗藍,否則就停下回藍,走的路程只需要維護先前算出的結果即可,

我們之前已經算出閃現能走多遠,那就只需判斷該狀態下不閃現或不停(跑步不耗藍)是否比之前更優即可

如果f[i]>=s就已經逃出,直接輸出並結束程式,否則就沒有逃出

但這道題目並沒有狀態轉移方程,,上網搜了一下說這是基於時間軸的dp,,

#include#include#include#includeusing namespace std;

const int maxn=300000+18;

int m,s,t;

int f[maxn];

int main()

else

}for(int i=1;i<=t;i++) }

printf("no\n%d",f[t]);

return 0;

}

守望者的逃離

前言 送你破鍵盤,廉價發打字聲依稀。送你破電腦,便宜的讓你去做題。一本藍皮書一直沒落任能回味,那套高質量題 歡迎來到嘟嘟課堂。今天,嘟嘟老師要講一道看起來很難,實際卻很簡單的題 守望者的逃離。題目描述 惡魔獵手尤迫安野心勃勃.他背叛了暗夜精靈,率深藏在海底的那加企圖叛變 守望者在與尤迪安的交鋒中遭遇...

守望者的逃離

功能 判斷守望者是否能夠逃出荒島 輸入引數 unsigned int uimagic 無符號整型,守望者的初始魔法值 unsigned int uidistance 無符號整型,守望者所在的初始位置與島出口之間的距離。unsigned int uisec 無符號整型,島沉沒需要的時間,單位為秒 輸出...

守望者的逃離

惡魔獵手尤迪安野心勃勃,他背叛了暗夜精靈,率領深藏在海底的娜迦族企圖叛變。守望者在與尤迪安的交鋒中遭遇了圍殺,被困在乙個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去。到那時,島上的所有人都會遇難。守望者的跑步速度為17m s,以這樣的速度是無法逃離荒島的。慶幸的是守望...