A - 3 つの整数 (Three Integers) Editorial by TumoiYorozu


この解説は、C++ に入門したばかりの中高生レベルを想定して、考察の方法、コードの書き方の解説をします。

解法A

1 か 2 しか無いので、1 の個数をカウントして、1の個数が2個以上であれば 1、違ければ 2 を表示すると良い。

実装のヒント1: 1 の個数をカウントするには

変数 x を用意して、もしもAが1だったら xに1を加算、もしもBが1だったらxに1を加算、もしもCが1だったらxに1を加算すると良い。

実装のヒント2: 「1を加算」

C++では、

#include <bits/stdc++.h>
using namespace std;
int main(){
    int A, B, C;
    cin >> A >> B >> C;
    int x = 0;
    if (A == 1) {
        x + 1;
    }
}

のように、x+1 だけを書いても、x+1を計算するだけで、xの中身は書き換わらない。 x + 1を計算するだけではなく、x も更新しないといけないので

x = x + 1
と書く必要がある。なおこの様な変数に値を加算する処理はよくあるので、C++ではこれを省略して
x += 1
で x に 1 を直接加算することが出来る。

更に、変数に1加算する処理はよくあるので、それもまた省略して

x++
と書くことも出来る。

解答コード

コード例 (実際の提出のリンクはこちら)

#include <bits/stdc++.h>
using namespace std;
int main(){
    int A, B, C;
    cin >> A >> B >> C;
    int x = 0;
    if (A == 1) {
        x++;
    }
    if (B == 1) {
        x++;
    }
    if (C == 1) {
        x++;
    }
    if (x >= 2) {
        cout << 1 << endl;
    } else {
        cout << 2 << endl;
    }
}

解法B

整数が3つあり、それぞれ1か2のどちらかなので、1か2のどちらかは必ず2つ以上ある。

つまり、A,B,C のうち少なくとも2つは同じであり、同じものがあればそれが多数派であることが分かる。

実装のヒント1

if 文を3つ書くと良い。

実装のヒント2

場合分けは、

  • A と B が等しい場合
  • A と C が等しい場合
  • B と C が等しい場合
を考えれば良い。

解答コード

コード例 (実際の提出のリンクはこちら)

#include <bits/stdc++.h>
using namespace std;
int main(){
    int A, B, C;
    cin >> A >> B >> C;

    if (A == B) {
        cout << A << endl;

    } else if (A == C) {
        cout << A << endl;

    } else if (B == C) {
        cout << B << endl;
    }
}

また以下のようなコードも正解である。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int A, B, C;
    cin >> A >> B >> C;

    if (A == B || A == C) {
        cout << A << endl;
    } else {
        cout << B << endl;
    }
}

余談だが、この様な考え方を 鳩ノ巣原理 と言う。

今回、3つの変数を2グループに分けるケースなので、\(\lceil \frac{3}{2} \rceil = \lceil 1.5 \rceil = 2\) であるので、2つあるグループが少なくとも1つ存在することが分かる。

今回は非常にシンプルなケースなのでわざわざ 鳩ノ巣原理を持ち出す必要は全く無いが、競技プログラミングでは鳩ノ巣原理の考え方を応用する問題はよく出てくるので、この用語は覚えておくとよいだろう。

posted:
last update: