2007noip普及組 守望者的逃離

2021-09-10 07:06:22 字數 2005 閱讀 8066

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

樣例輸入

39 200 4

樣例輸出

no197

提示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

記憶化搜尋即可,但是原則上,如果記憶體限制不夠大的話30w的dfs會爆棧,這裡不應該用dfs而應該用bfs…

先搜尋出所有 f[i

][j]

f[i][j]

f[i][j

] 的結果,f[i

][j]

表示第i

秒,剩餘

藍量是j

能走的最

遠距

離f[i][j]表示第 i 秒,剩餘藍量是 j 能走的最遠距離

f[i][j

]表示第

i秒,剩

餘藍量是

j能走的

最遠距離

,最後遍歷整個 f 陣列找乙個最優解即可

#includeusing namespace std;

int m,s,t,ans,anstime;

int f[300105][15]=;

void dfs(int nowtime,int way,int value)

else

}int main()

//兩個特殊情況,即藍沒用完,卻已經逃離了,或藍沒用完,時間到了

if (start >= s)

if (starttime == t)

dfs(starttime,start,m);

int ans = 0;

//在所有的狀態中搜尋乙個最優解,若某次搜尋發現已經逃離,那麼當前時間就是最小時間

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

for (int j = 0; j <= 14 ; ++j)

} printf("no\n%d",ans);

return 0;

}

用f[t]表示守望者在t時間內所能走的最遠距離,g[t]表示守望者只使用閃爍法術在t時間內所能走的最遠距離。 則相應的狀態轉移方程為

f[0] = g[0] = 0 \\ f[t] = max(f[t-1] + 17, g[t]) \end

else

if (d1 > d2 + 17) d2 = d1;

else d2 += 17;

if (d2 >= s) break;

}if (i > t) printf("no\n%d\n", d2);

else printf("yes\n%d\n", i);

return 0;

}

NOIP2007普及 守望者的逃離

傳送門 普及組的題目 很水。原來寫了乙個模擬不過好像狀態考慮的不全得了80,這次我們考慮一下dp做法。守衛者有兩種移動的方法,一種是閃現,一種是跑,我們可以把閃現和跑分開處理。首先只處理閃現的情況,這個時候要用貪心,能閃就閃,否則原地回藍即可。之後在處理跑步的情況,這種情況就要用dp了,方程很好推,...

noip2007普及組 守望者的逃離 題解

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

2007noip普及組 Hanoi雙塔問題

給定a,b,c三根足夠長的細柱,在a柱上放有2n個中間有空的圓盤,共有n個不同的尺寸,每個尺寸都有兩個相同的圓盤,注意 這兩個圓盤是不加區分的 下圖為n 3的情形 現要將這些國盤移到c柱上,在移動過程中可放在b柱上暫存。要求 1 每次只能移動乙個圓盤 2 a b c三根細柱上的圓盤都要保持上小下大的...