Редакция для Среднее по величине из трёх чисел
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
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. Алгоритм
- Считать три целых числа
a,b,c. - Найти
mn— минимум из трёх чисел. - Найти
mx— максимум из трёх чисел. - Вычислить
ans = a + b + c - mn - mx. - Вывести
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)
Комментарии