UOJ 452 鑰匙挖牆

2022-05-25 19:12:09 字數 1441 閱讀 2904

密閉的走廊四周都是水泥牆,只有一側由近到遠有著n+1個鐵門(編號0至n),越越走進了唯一開著的0號鐵門,拿到了一把鑰匙和逃亡說明:「按照鑰匙上數字ai的提示,前進或後退ai個鐵門,然後開啟對應的鐵門,拿到裡面的鑰匙,直到開啟n號鐵門就可以逃出密室。」

越越剛鼓起勇氣準備乙個個的開啟鐵門,可是看了看走廊盡頭他差點噴出一口鮮血,n<=1,000,000。一定還有其他的辦法。越越走回0號房間坐在桌子上沉思……。還是沒辦法。越越氣的拿腦袋撞牆:「碰碰……」。「等等」。

房間之間的牆是木板的,而且不是很厚,撞是撞不開的。越越舉起手中大號的銅鑰匙,鑰匙沒手柄,塞入鑰匙孔就拿不出來了,但鑰匙齒很鋒利,用來鋸乙個讓人穿過的孔還是可以的。鑰匙鋸開乙個孔後磨損的也就不能用了。

看來越越除了拿鑰匙按照順序開門外,在第i個房間他還有另外兩個選擇,就是用鑰匙挖通至i-1或i+1房間的牆。當然在0號房間挖牆只能向1號房間,n號房間就是出口。(一把鑰匙可以用來開一扇門或者挖一堵木牆)

現在給你每扇門後鑰匙上的數字,你能算出越越最少用掉幾把鑰匙才能走出這個恐怖的走廊嗎?

第一行乙個正整數數字n

第二行n個正整數順序表示第0到第n-1扇門後鑰匙上的數字。

輸出越越需要開幾扇門才能走出走廊。

10

5 9 4 6 4 -3 -5 -7 -5 -2

2
每個鐵門上房間號:  0  1  2  3  4  5  6  7  8  9 10

房內鑰匙上的數字: 5 9 4 6 4 -3 -5 -7 -5 -2

越越進房間的順序: 0 1 2

題解:我就是人間活腦癱,擺著的最短路我都看不出來,我還在那寫dp推式子推的一身勁,好傢伙推了個0分

#include#include

#include

#include

#include

#include

#include

typedef

long

long

ll;using

namespace

std;

const

int n=1000001

;const

int oo=0x3f3f3f3f

;struct

nodee[n*3

]; int

n,x,a[n],cnt,head[n],vis[n],dis[n];

void add(int x,int

y) queue

q; void

spfa()}}

}}int

main()

spfa();

printf("%d

",dis[n]);

return0;

}