このセットの解けた問題の中で、結果的には一番苦戦したという・・・。
問題
https://codeforces.com/contest/1385/problem/A
問題概要
正の整数x, y, z
が与えられる。x = max(a, b), y = max(a, c), z = max(b, c)
となるような正の整数a, b, c
を一つ示せ。そのようなa, b, c
が存在しない場合はその旨を示せ。
考察
以下x >= y >= z
、a >= b >= c
として考えます。(条件は循環しているので、そのような大小関係になるように入れ替えて問題ないです)
x, y, zの大小関係について、以下の4つのパターンがありえます。
- x = y, y = z (ex. 10, 10, 10)
- x = y, y > z (ex. 10, 10, 9)
- x > y, y = z (ex. 10, 9, 9)
- x > y, y > z (ex. 10, 9, 8)
1番目のパターンは、a = b = c = x
とすれば常にmaxがxとなるので問題ありません。
2番目のパターンはa = x
とすると、max(a, b)
と max(a, c)
がa = x = y
となり、あとはmax(b, c) = z
となるようにb, cを決めればよいです。
3, 4番目のパターンは、a = x
とすると、max(a, b)
と max(a, c)
がa = x = y
となってしまうため、構築不可能です。
#include <bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int a, b, c; cin >> a >> b >> c; int mx = max({a, b, c}); if (a != b and b != c and c != a) { cout << "NO" << endl; } else if (a == b and b == c and c == a) { cout << "YES" << endl; cout << a << " " << a << " " << a << endl; } else { // 最大値と同じものが2つないとだめ if (mx == a and mx == b or mx == a and mx == c or mx == b and mx == c) { cout << "YES" << endl; cout << max({a, b, c}) << " " << min({a, b, c}) << " 1" << endl; } else { cout << "NO" << endl; } } } }
反省
今、自分の2WAのコードを見直してみたところ、一箇所elseを書き忘れてました。on_
なにやってんだか・・・。