メモ帳がわり

個人的なメモを残します。主に競プロ

【ABC207】B - Hydrate

問題リンク
B問題にしては難しかった。

解法

N回操作した後の赤色のボールの数はC×D×Nなので、一回の操作でC×D個の赤ボールを追加するとしても問題ない。
そうすると赤ボールの数が青ボールの数以上になるのはいつか、という問題になる。
一回の操作で赤ボールと青ボールの差は、C×D-B個縮まるので、これが0以下だと永遠に差が縮まらないことになる。よってこの時-1を出力する。
初期状態の差はAであるので、この差が何ターンで0以下になるかを考えると答えは、A / (C×D-B) 以上の最小の整数になる。

実装

void solve(long long A, long long B, long long C, long long D) {
    int d = C * D - B;
    if (d <= 0) cout << -1 << endl;
    else cout << (A + d - 1) / d << endl;
}