【競プロ】1日1AC : ABC93 C問題

4日目です。今日の問題はこちら。

Difficultyは302(灰)です。
AtCoder Problemsより)

余裕がある人は先に解いてから読んでください。

提出コードと考えたこと

#include <bits/stdc++.h>
using namespace std;

int main(){
    int a,b,c;
    cin >> a >> b >> c;

    int x = max(a,max(b,c));
    int value = 3 * x - (a + b + c);
    int ans;
    if(value % 2 == 0) ans = value / 2;
    else ans = (value + 3) / 2;

    cout << ans << endl;
    return 0;
}

操作を行なってすべての数が \( x \) になったとき、それまでに加えた数の総和はvalueの値になります。数を加えることしかできませんから \(x \ge \max \left\{ a,b,c \ \right\} \) です。

1回の操作で数の総和は2だけ増えるので、valueは偶数である必要があります。また、操作回数はvalue\( / 2 \) になります。
よって \( x = \max \{ a,b,c \ \} , \max \{ a,b,c \ \} + 1\) のどちらかが、操作回数が最小になるような \( x \) です。

あとはvalueの偶奇で場合を分けて答えを求めます。

終わりに

今回も解けるまでに結構時間をかけてしまったので、まだまだ演習が必要そうです。また、部分的に説明が不十分なところがあるので追記すると思います。

コメント