洛谷P3403 跳樓機(最短路)

2022-04-28 17:12:09 字數 2533 閱讀 7790

題目背景

djl為了避免成為乙隻鹹魚,來找srwudi學習壓**的技巧。

題目描述
srwudi的家是一幢h層的摩天大樓。由於前來學習的蒟蒻越來越多,srwudi改造了乙個跳樓機,使得訪客可以更方便的上樓。

經過改造,srwudi的跳樓機可以採用以下四種方式移動:

向上移動x層;

向上移動y層;

向上移動z層;

回到第一層。

乙個月黑風高的大中午,djl來到了srwudi的家,現在他在srwudi家的第一層,碰巧跳樓機也在第一層。djl想知道,他可以乘坐跳樓機前往的樓層數。

輸入格式
第一行乙個整數h,表示摩天大樓的層數。

第二行三個正整數,分別表示題目中的x, y, z。

輸出格式
一行乙個整數,表示djl可以到達的樓層數。

輸入
15

4 7 9

輸出
輸入
33333333333

99005 99002 100000

輸出
提示
可以到達的樓層有:1,5,8,9,10,12,13,14,15

想不出來不要死磕這一題,先看看第三題。。。。

1<=h<=\(2^\)-1

1<=x, y, z<=100000

假設可以到達的樓層為t

我們可以得到乙個方程:t=ax+by+cz

如果設t'=by+cz,原方程就變成了t=a'x+t'

f[i]表示表示僅通過操作2和操作3能到達的mod x == i的最小樓層t'

(這裡為什麼要是最小樓層呢,舉個栗子:x == 5時,7和12都滿足mod x == 2.而12 = 7 +5,表示12層可以被後面討論操作一的時候列舉到)

注意:一定要把f[i]的i與f[i]的含義分開,i是f[i] mod x的結果,即i == f[i]%x

狀態轉移方程:

f[i+y] = f[i]+y;

f[i+z] = f[i]+z;

最短路方程:

dis[b]=dis[a]+len[a][b];

我們把f[i+z]看做dis[b],把f[i]看做dis[a],將z看做b[(i+z)%x]點和a[i]點之間的邊權(y同理)

在這裡,(i+y)%x的是防止i+y超過x

建圖過程:

void add(int x,y,a)

……for(int i=0;i因為是求最小樓層t',所以用spfa/dijkstra解決

通過spfa/dijkstra,我們已經求出了僅通過操作2和操作3能到達的mod x == i的最小樓層t'

那麼就可以很快的求出還剩幾層樓可以跳:(h - f[i]),從而推出剩下僅通過操作一可以跳的樓層個數:(h - f[i])/x(向下取整,因為不能跳超過h層)

再通過ans與它之間的聯絡算出答案:ans += (h - f[i])/x + 1(剩下可以跳的樓層個數+f[i]本身這一層樓)

乙個問題:如果到達f[i]之前有經過其他點,那麼從ans += (h - f[i])/x + 1來看,並沒有將到達f[i]之前經過的點的個數計入答案,是否存在漏算?

舉個栗子來解釋:

x=8,y=3,z=5,h=100

f[7]=1+3+3=7

i == 7

ans = ans + (h-f[7])/x+1 == ans + (100-7)/7 +1 == ans + 14

作為「中轉站」:第4樓能夠達到,卻並沒有被算在ans裡

回過頭去看i == 4

ans = ans + (h-f[4])/x+1 == ans + (100 - 4)/7+1 == ans + 9

也就是說,第4樓在算第7樓之前就已經算過了,再次計入ans只會使答案出現重複

最後吐槽一下,這是一道省選難度的noip模擬題

【因為蹲在牆角所以有回聲的小聲bbbbbbbbbbbbbbb...】

洛谷P3403 跳樓機

題目傳送門 套路題,同餘最短路。先只考慮y z進行連邊,再在mod x的意義下進行計算。這裡的 距離 dis i 指的是,在所有滿足a mod x i的a裡,能到達的最小的a是多少。顯然只要能到達dis i 每次加x即可到達dis i 上面所有mod x i的樓層。最後根據計算出來的dis來統計答案...

洛谷P3403 跳樓機

srwudi 的家是一幢 h 層的摩天大樓。由於前來學習的蒟蒻越來越多,srwudi 改造了乙個跳樓機,使得訪客可以更方便的上樓。經過改造,srwudi 的跳樓機可以採用以下四種方式移動 向上移動 x 層 向上移動 y 層 向上移動 z 層 回到第一層。乙個月黑風高的大中午,djl 來到了 srwu...

洛谷P3403跳樓機(最短路構造 同餘最短路)

題目 最短路構造很神啊。先用前兩個值跑在第三個值模意義下的同餘最短路 這步貪心可以證明,如果第三步長為z,那麼如果n z可以達到,n 2z同樣可以達到 最後計算與樓頂差多少個模計算一下就好了 細節 不要忘了自己也是乙個解 1 include2 include3 include4 include5 t...