けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 047 A - キャンディーと2人の子供 (灰色, 100 点)

これも「まずソートして考える」が効く系。でも、そうしなくても解ける。

問題概要

3 つの正の整数  a, b, c が与えられる。

これらを 2 つのグループに分けて、各グループの数値の総和が等しくなるようにできるかどうかを判定せよ。

解法 (1):場合分け

3 つの正の整数を 2 つのグループに分ける方法は、

  • a と b, c
  • b と c, a
  • c と a, b

の 3 通りである。それぞれ確かめればよい。

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

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    
    if (a == b + c || b == c + a || c == a + b) cout << "Yes" << endl;
    else cout << "No" << endl;
}

解法 (2):まずソート

この問題に限らず、与えられた入力を配列として受け取って、まず小さい順にソートしてみることが有効打となることは多い。ソートして

v[0] < v[1] < v[2]

となるようにできたとする。このとき、v[2] が最大の数となるので、もしグループ分けできるとしたら、

{v[0], v[1]} と {v[2]}

という分け方しかありえない。判定がとても楽になるのだ。

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

int main() {
    vector<int> v(3);
    cin >> v[0] >> v[1] >> v[2];
    
    // 小さい順に並び替える
    sort(v.begin(), v.end());
    
    if (v[0] + v[1] == v[2]) cout << "Yes" << endl;
    else cout << "No" << endl;
}