競技プログラミングのためのF#入門
1 2 3 |
|
二つ要点があります. 一つは何回目で実現できるかに関連して二分探索を思いつけるか, 二分探索を思いつけたとしてどう実装するかです.
ここでは後者の二分探索で何をどう調べるか考えましょう. あるm
秒目で必要な枚数が印刷できたかどうかを調べる必要があります. 問題設定からその時間までに各i
番目のプリンターはm/Ai
枚印刷できています. あとはこの総和を取って必要枚数印刷できたか確認します.
命令型の言語ではwhile
で処理する方が多いように思います. ここでは再帰関数で処理します. 二分探索はアルゴリズムのどの本にも載っているため細かい解説は省略します.
1 2 3 4 5 6 7 8 |
|
問題の制約で答えは 10^9 を超えない
とあるため, 最大値(最初のr
)はr = 10^9
に取ればよいでしょう. もちろん1 \leq Ai
の仮定からも保証されます.
途中の印刷枚数確認はArray.sumBy
でmi/a
の和を積めば計算できます.