Ну логика под return pow(max(a, b), 2) + pow(max(min(a, b), c), 2); мне кажется довольно простой. min(a,b) дает результат противоположный тому который даёт max(a,b), то если одна функция выбирает a то вторая непременно выбирает не a, то есть выбирает b, вот и всё.
wrest, за выделенные слова отдельное спасибо. Такое описание мне больше нравится, чем то что я написал.
Цитата:
Какую штуку придумали? Второе решение? Примерно так:
1. Задача эквивалентна задаче "сравнить три числа и выбрать меньшее".
2. Для этого достаточно двух сравнений.
3. Выбираем любые два числа и сравниваем.
4. Берем меньшее из них и сравниваем с третьим числом.
5. Далее все очевидно.
rockclimber, спасибо. Не сразу, но понял почему это эквивалентная задача.
Задача "сравнить три числа и выбрать второе наибольшее число, т.е. то, которое больше минимума и меньше максимума".
За два сравнения мы не всегда можем получить второе наибольшее число. Это происходит, потому что если в первом сравнении мы можем получить максимум, а, значит, при втором сравнении этого максимума и третьего значения мы можем получить минимум.
Посмотрим, что будет, если делать сравнения наоборот:
, хотя правильнее
, потому что операторы сравнения возвращаю булевые значения, а не значение аргументов.
И снова за два сравнения мы не всегда получаем второе максимальное число, потому что если при первом сравнении мы получили минимум, то при втором сравнении этого значение и третьей величины, мы получим максимум, а не второй максимум.
Но если мы откажемся от идеи получить всегда второе наибольшее число, то можем поствупить так:
возьмем вариант поиска, который дает нам либо максимум, либо второе наибольшее число. Если мы сможем получить противоположный результат этого поиска, то задача будет решена.
И вот тут не могу придумать как получить сделать заключительный шаг.
Так-то я вижу, что в
заключено сравнение пар
и нам надо сделать еще сравнение последней пары
.
Но мне кажется тут есть более простой путь.