これも「まずソートして考える」が効く系。でも、そうしなくても解ける。
問題概要
3 つの正の整数 が与えられる。
これらを 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; }