Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

A. Three Pairwise Maximums (Codeforces Round #656 Div. 3)

このセットの解けた問題の中で、結果的には一番苦戦したという・・・。

問題

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 >= za >= 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_

なにやってんだか・・・。