Редакция для Три числа по возрастанию


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Автор: montes332

1. Идея

Нужно вывести три числа a, b, c в порядке неубывания.

Так как чисел всего три, полноценная сортировка не нужна. Достаточно отдельно найти:

  • минимальное число mn,
  • максимальное число mx,
  • среднее число mid.

После этого ответ будет таким: mn mid mx.

Среднее число удобно найти через сумму:

mid = a + b + c - mn - mx

2. Наблюдения

Наблюдение 1

Минимум среди трех чисел можно найти последовательными сравнениями:

  • сначала считаем, что минимум — это a,
  • если b < mn, обновляем минимум,
  • если c < mn, снова обновляем.

Точно так же находится максимум.

Наблюдение 2

Когда минимум и максимум уже известны, третье число — это просто остаток от общей суммы.

Например, если числа 3, 1, 2:

  • mn = 1
  • mx = 3
  • mid = 3 + 1 + 2 - 1 - 3 = 2

Наблюдение 3

Этот способ работает и когда числа совпадают.

Пример: 5 5 -1

  • mn = -1
  • mx = 5
  • mid = 5 + 5 + (-1) - (-1) - 5 = 5

Ответ: -1 5 5

3. Алгоритм

  1. Считать a, b, c.
  2. Найти минимум:
    • mn = a
    • если b < mn, то mn = b
    • если c < mn, то mn = c
  3. Найти максимум:
    • mx = a
    • если b > mx, то mx = b
    • если c > mx, то mx = c
  4. Найти среднее:
    • mid = a + b + c - mn - mx
  5. Вывести mn, mid, mx.

4. Почему это работает

Докажем, что алгоритм всегда выводит числа в правильном порядке.

  • После последовательных сравнений mn действительно равен наименьшему из чисел a, b, c.
  • Аналогично mx действительно равен наибольшему из них.
  • Сумма a + b + c состоит из трех чисел: минимального, среднего и максимального.
  • Если из этой суммы вычесть минимум и максимум, останется ровно среднее число.

То есть:

  • mn — первый элемент ответа,
  • mid — второй,
  • mx — третий.

Так как mn <= mid <= mx, вывод получается в порядке неубывания.

5. Сложность

Алгоритм выполняет фиксированное число сравнений и арифметических операций.

  • Время: O(1)
  • Память: O(1)

6. Код на C++17

#include <iostream>
using namespace std;

int main() {
    long long a, b, c;
    cin >> a >> b >> c;

    long long mn = a;
    if (b < mn) mn = b;
    if (c < mn) mn = c;

    long long mx = a;
    if (b > mx) mx = b;
    if (c > mx) mx = c;

    long long mid = a + b + c - mn - mx;

    cout << mn << ' ' << mid << ' ' << mx;
    return 0;
}

7. Код на Python 3

a, b, c = map(int, input().split())

mn = a
if b < mn:
    mn = b
if c < mn:
    mn = c

mx = a
if b > mx:
    mx = b
if c > mx:
    mx = c

mid = a + b + c - mn - mx

print(mn, mid, mx)

Комментарии

Еще нет ни одного комментария.