Official

B - ロープの収納 / Storing the Rope Editorial by harurun4635


\(\displaystyle L \gets \Big \lceil \frac{L}{2} \Big \rceil\) を繰り返して、何回で \(X\) 以下にできますか?という問題です。

一回の操作で、およそ \(1/2\) になりますから、愚直にシミュレーションしても、 \(O(\log(L / W))\) で求めることができます。

「およそ」というのは厳密ではないですが、たとえば \(L \ge 2\) なら \(3/4\) 倍より小さいことであれば厳密に示せるため、 \(O(\log L )\) であることは簡単に納得できると思います。

他にも、具体的に \(k\) 回の操作後 \(\displaystyle \Big \lceil \frac{L}{2^k} \Big \rceil\) であることをもちいれば、計算量の証明もできますし、 \(O(1)\) で解くことも可能です。


実装例

l, w = map(int, input().split())
c = 0
while l > w:
    l = (l + 1) // 2
    c += 1
print(c)

posted:
last update: