この問題はfor文と簡単な式変形を問います。
今のラテ君の残額を now(=A) として、これを問題の通りに計算します。具体的には i 個目における計算は
- now−Ti≥0 なら now←now−Ti
- now−Ti<0 なら、now<0 の間だけ now←now−Ti+B
となります。ただし P←Q は変数 P に値 Q を代入する操作を表します。
しかし、この計算を愚直に計算していると、now−Ti<0 の計算でケースによっては時間制限に間に合わない場合があります。
そこで次のような式において、この式を変形することを考えます。
now−Ti<0 の場合、残額に B を足すことを繰り返す回数は、一意に定まります。
この回数を k として now−Ti+kB≥0 を満たすことが、この計算処理を終わらせる条件です。
これを変形すると k≥BTi−now であることがわかります。つまり k=⌈BTi−now⌉ ※と計算できます。
さらに now−Ti<0 より Ti−now>0 から、右辺に負数が出現しないことがわかります。
これより now−Ti+kB≥0 を満たす最小の整数 k を求めることができました。
これを計算式として用いることで、now−Ti<0 の計算を O(1) で処理することができます。
以上でこの問題を O(N) で正解することができます。
解答例(C++):
※ ⌈x⌉ は x 以上で最小の整数を表します(天井関数といいます)。例えば ⌈3.5⌉=4 、⌈8⌉=8 です。