Редакция для Среднее по величине из трёх чисел


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. Идея

Нужно найти число, которое находится между двумя другими по величине.

Самый удобный способ — взять сумму трёх чисел и вычесть из неё:

  • минимальное число,
  • максимальное число.

Тогда останется именно среднее по величине число.

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

  • сумма равна 6,
  • минимум равен 1,
  • максимум равен 3,
  • значит, ответ: 6 - 1 - 3 = 2.

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

Наблюдение 1

Среди трёх чисел всегда можно выделить:

  • наименьшее,
  • наибольшее,
  • и одно оставшееся число.

Именно это оставшееся число и требуется вывести.

Наблюдение 2

Если некоторые числа совпадают, метод всё равно работает.

Пример: 5 5 7

  • сумма 17,
  • минимум 5,
  • максимум 7,
  • ответ 17 - 5 - 7 = 5.

Пример: 4 4 4

  • сумма 12,
  • минимум 4,
  • максимум 4,
  • ответ 12 - 4 - 4 = 4.

То есть совпадение чисел не создаёт проблем.

Наблюдение 3

Ограничения достаточно большие, поэтому в C++ лучше использовать тип long long, чтобы безопасно хранить сумму a + b + c.


3. Алгоритм

  1. Считать три целых числа a, b, c.
  2. Найти mn — минимум из трёх чисел.
  3. Найти mx — максимум из трёх чисел.
  4. Вычислить ans = a + b + c - mn - mx.
  5. Вывести ans.

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

Обозначим три числа как:

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

Тогда сумма трёх чисел равна:

mn + mid + mx

Если из этой суммы вычесть минимальное и максимальное числа, останется:

mn + mid + mx - mn - mx = mid

То есть мы получаем именно средний по величине элемент.

Это рассуждение верно и тогда, когда некоторые числа равны. Например:

  • если два числа равны минимуму,
  • если два числа равны максимуму,
  • если все три числа одинаковы.

Во всех случаях формула всё равно оставляет правильный ответ.


5. Сложность

По времени: O(1), потому что выполняется фиксированное число операций.

По памяти: O(1), потому что используются только несколько переменных.


6. Код на C++17

#include <iostream>
#include <algorithm>
using namespace std;

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

    long long mn = min(a, min(b, c));
    long long mx = max(a, max(b, c));
    long long ans = a + b + c - mn - mx;

    cout << ans << '\n';
    return 0;
}

7. Код на Python 3

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

mn = min(a, b, c)
mx = max(a, b, c)
ans = a + b + c - mn - mx

print(ans)

Комментарии

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