題目背景
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...