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

2022-05-06 21:00:07 字數 1269 閱讀 4872

題目位址

當出現形如「給定 \(n\) 個整數,求這 \(n\) 個整數能拼湊出多少的其他整數(\(n\) 個整數可以重複取)」,以及「給定 \(n\) 個整數,求這 \(n\) 個整數不能拼湊出的最小(最大)的整數」的問題時可以使用同餘最短路的方法。

引自 oi-wiki。

不妨設 \(x < y < z\)。(為了減少狀態)

設 \(dist[i]\) 為最小的 \(p=ay+bz\) 且 \(p \equiv i \pmod \)

則可以對於每個 \(i\),連一條 \(i->(i+y)\%x\) 的邊,邊權為 \(y\),連一條 \(i->(i+z)\%x\) 的的邊,邊權為 \(z\)。在以 \(1\) 為起點這個圖上跑最短路,就可以求出 \(dist[i]\) 了。

注意 \(x,y,z \le 10^5\),所以 \(x\) 和 \(y\) 的最小公倍數最大是 \(xy \le 10^\) 不會爆long long,也就是說 \(dist[i]\) (如果不為 \(inf\) 的話)不會超過 \(10^\)。

求出 \(dist[i]\) 後,可以發現 \(dist[i]+kx,k \in z\) 都可以到達(這就是設計同餘狀態的意義),於是就可以算出可以到多少個樓層了。

時間複雜度 \(o(n \log n)\)。

#include#define int long long

#define mp make_pair

#define fi first

#define se second

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x * f;

}typedef pairpii;

const int n = 1e5+7;

int h,x,y,z,cnt;

int head[n],dist[n];

struct edge edge[n<<1];

inline void add(int u,int v,int w)

bool vis[n];

void dijkstra()

} }}signed main()

} }printf("%lld\n",ans);

return 0;}/*

154 7 9

9*/

利用同餘設計狀態。

同餘最短路。

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

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

P3403 跳樓機 同餘最短路

傳送門 題意 思路 轉換一下題目就是用若干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即可。然鵝直接...

洛谷P3403 跳樓機(最短路)

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