傳送門
題意:
思路:轉換一下題目就是用若干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...