P3403 跳樓機 同餘最短路

2021-10-20 19:10:11 字數 2413 閱讀 4262

傳送門

題意:

思路:轉換一下題目就是用若干x,y

,zx,y,z

x,y,

z能湊出來多少個<=h

<=h

<=h

的數。先考慮兩個數y,z

y,zy,

z的情況,我們如果能求出來這兩個數能湊出來的數設為sum

sumsu

m,讓後sum

+kx<=h

sum+kx<=h

sum+kx

<=h

求出來有多少個k即可。然鵝直接求也是不行的,因為h

hh很大,如果h

hh很小我們直接bfs

bfsbf

s跑一遍就好啦。考慮優化sum

+kx<=h

sum+kx<=h

sum+kx

<=h

這個式子。可以看到我們只需要最大化k

kk即可,也就是最小化sum

sumsu

m,也即是讓 sum

modx

sum\bmod x

summod

x,現在定義dis

[i]dis[i]

dis[i]

為能到達i

ii所需要走的最小層數(i為在模x

xx的意義下的)。算出來dis

[i]dis[i]

dis[i]

之後可以通過ans

+=(h

−dis

[i])

/x+1

ans+=(h-dis[i])/x+1

ans+=(

h−di

s[i]

)/x+

1算出來答案。

d is

disdi

s沒開llll

ll,直接自閉。

設模數為x

xx,用dij

kstr

adijkstra

dijkst

ra的話可以o(x

logx

)o(xlogx)

o(xlog

x)

//#pragma gcc optimize(2)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define x first

#define y second

#define l (u<<1)

#define r (u<<1|1)

#define pb push_back

#define mk make_pair

#define mid (tr[u].l+tr[u].r>>1)

#define len(u) (tr[u].r-tr[u].l+1)

#define random(a,b) ((a)+rand()%((b)-(a)+1))

#define db puts("---")

using

namespace std;

//void rd_cre()

//void rd_ac()

//void rd_wa()

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

const

int n=

1000010

,mod=

1e9+

7,inf=

0x3f3f3f3f

;const

double eps=

1e-6

;ll x,y,z;

ll h;

ll dis[n]

;bool st[n]

;void

bfs(

) t=

(u+z)

%x;if

(dis[t]

>dis[u]

+z)}

}int

main()

/**/

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

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

洛谷P3403 跳樓機(最短路)

題目背景djl為了避免成為乙隻鹹魚,來找srwudi學習壓 的技巧。題目描述srwudi的家是一幢h層的摩天大樓。由於前來學習的蒟蒻越來越多,srwudi改造了乙個跳樓機,使得訪客可以更方便的上樓。經過改造,srwudi的跳樓機可以採用以下四種方式移動 向上移動x層 向上移動y層 向上移動z層 回到...

洛谷 3403 跳樓機(同餘最短路)

題目位址 當出現形如 給定 n 個整數,求這 n 個整數能拼湊出多少的其他整數 n 個整數可以重複取 以及 給定 n 個整數,求這 n 個整數不能拼湊出的最小 最大 的整數 的問題時可以使用同餘最短路的方法。引自 oi wiki。不妨設 x y z 為了減少狀態 設 dist i 為最小的 p ay...