mayoko’s diary

プロコンとかいろいろ。

SRM 522 div1 med:CorrectMultiplication

解法

とりあえず 1 * 1 = 1 なので 答えは a+b+c-3 に抑えることが出来ます。

また, a <= b とすると, 明らかに A <= B となる方が得です。この時, A の値は 10^5 程度に抑えられます。
A の値をとある一つの値に決めた時, あと B と C の値を決定する必要がありますが, c に合わせるほうが得です(b に合わせると, c から C の値が A ( >= 1) ずれるが, c に合わせると b から B の値は たかだか 1 しかずれない)。

よって, B の値は c/A + o (-1 <= o <= 1) だけを試せば良いです。

class CorrectMultiplication {
public:
    long long getMinimum(int a, int b, int c) {
        if (a > b) swap(a, b);
        ll ret = (ll)a+b+c-3;
        for (ll A = 1; A <= 100000; A++) {
            for (int o = -1; o <= 1; o++) {
                ll B = c/A+o;
                if (B <= 0) continue;
                ll C = A*B;
                ret = min(ret, abs(A-a)+abs(B-b)+abs(C-c));
            }
        }
        return ret;
    }
};