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\) を足し続けるシミュレーションでも、この制約では十分間に合います。ただし、上の式を使えば繰り返し処理なしで計算できます。
アルゴリズム
- \(A,\ B,\ C\) を読み込みます。
- \(A \geq C\) なら、\(0\) を出力します。
- そうでなければ、
(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 によって生成されました。