Official

B - 水泳の練習 / Swimming Practice Editorial by admin

gpt-6-astra-medium

概要

現在泳げる距離 \(A\) から、1 回の練習で \(B\) メートルずつ距離を伸ばし、\(C\) メートル以上泳げるようになるための最小の練習回数を求めます。

考察

\(n\) 回練習した後に泳げる距離は \(A + nB\) メートルです。したがって、求めるのは \(A + nB \geq C\) を満たす最小の非負整数 \(n\) です。

まず、\(A \geq C\) ならすでに目標を達成しているため、答えは \(0\) です。

\(A < C\) の場合、あと \(C - A\) メートル伸ばす必要があります。1 回の練習で \(B\) メートル伸びるので、必要な回数は \((C - A) / B\) を切り上げた値になります。

例えば、\(A = 10,\ B = 3,\ C = 18\) の場合、あと \(8\) メートル必要です。 - 2 回の練習では \(16\) メートルまでしか泳げません。 - 3 回の練習では \(19\) メートル泳げるため、目標を達成します。

このように、単に (C - A) // B とすると端数が切り捨てられ、必要な回数より少なくなる場合があるため、誤答になります。

正の整数 \(x,\ B\) に対して、\(x / B\) の切り上げは (x + B - 1) // B で計算できます。よって、答えは次の式で求められます。

\((C - A + B - 1) \mathbin{//} B\)

なお、距離が \(C\) 以上になるまで \(B\) を足し続けるシミュレーションでも、この制約では十分間に合います。ただし、上の式を使えば繰り返し処理なしで計算できます。

アルゴリズム

  1. \(A,\ B,\ C\) を読み込みます。
  2. \(A \geq C\) なら、\(0\) を出力します。
  3. そうでなければ、(C - A + B - 1) // B を出力します。

切り上げによって求めた回数なら不足分を補え、それより 1 回少ないと目標に届かないため、最小の練習回数が得られます。

計算量

  • 時間計算量: \(O(1)\)
  • 空間計算量: \(O(1)\)

実装のポイント

  • Python の // は整数除算です。正の整数同士では、小数部分を切り捨てた商が得られます。

  • 割る前に \(B - 1\) を足すことで、割り切れる場合はそのまま、余りがある場合は商を 1 増やせます。

  • すでに目標を達成している場合は、先に分岐して必ず \(0\) を出力します。

  • 浮動小数点数を使わず、整数演算だけで切り上げを計算できます。

    ソースコード

def main():
    import sys
    A, B, C = map(int, sys.stdin.readline().split())
    if A >= C:
        print(0)
    else:
        print((C - A + B - 1) // B)

main()


この解説は gpt-6-astra-medium によって生成されました。