Редакция для Три числа по возрастанию
Submitting an official solution before solving the problem yourself is a bannable offence.
Автор:
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 = 1mx = 3mid = 3 + 1 + 2 - 1 - 3 = 2
Наблюдение 3
Этот способ работает и когда числа совпадают.
Пример: 5 5 -1
mn = -1mx = 5mid = 5 + 5 + (-1) - (-1) - 5 = 5
Ответ: -1 5 5
3. Алгоритм
- Считать
a,b,c. - Найти минимум:
mn = a- если
b < mn, тоmn = b - если
c < mn, тоmn = c
- Найти максимум:
mx = a- если
b > mx, тоmx = b - если
c > mx, тоmx = c
- Найти среднее:
mid = a + b + c - mn - mx
- Вывести
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)
Комментарии