Official

A - Hands Editorial by nuip


どちらの建物もそれほど高くないため、Dijkstra や Warshall–Floyd などの最短経路問題を解くアルゴリズムを使って解いても十分高速です。また、以下のように、単純な実装で \(O(1)\) で解くこともできます。

建物 A\(1\) 階から建物 B\(100\) 階まで廊下のみを使って移動したときの順番に、各フロアを並べた列を考えます。

A1 - B1 - A2 - B2 - \(\dots\) - A100 -B100

この列を観察すると、隣の階に \(x\) 分で移動でき、\(2\) 個隣の階には \(y\) 分で移動できることが分かります。\(2\) 個隣の階に移動する最短時間 \(\min(2x,y)\)\(y'\) と置きます。

そうすると、今いる場所とゴールが(上記の列で) \(2\) 個以上離れてる場合は \(y'\) 分で\(2\) 個隣の階に移動して、\(1\) 離れてる場合は\(x\) 分で隣の解に移動するのが最適な行動になります。

よって、この列で建物 A\(a\) 階と建物 B\(b\) 階が \(d\) 離れてるとしたとき、\(d=| 2b+1-2a|\) で、答えは \(\text{floor}(d/2) y' + x\) となります。ここで、\(|x|\)\(x\) の絶対値を表し、\(\text{floor}(x)\) は「切り捨て」( \(x\) を超えない最大の整数)を表します。

C++による実装

posted:
last update: