e-olymp 8352. Такси

Такси

В час пик на остановку одновременно подъехали три маршрутных такси, следующие по одному маршруту, в которые тут же набились пассажиры. Водители обнаружили, что количество людей в разных маршрутках разное, и решили пересадить часть пассажиров так, чтобы в каждой маршрутке было поровну пассажиров. Требуется определить, какое наименьшее количество пассажиров придется при этом пересадить.

Входные данные

Три натуральных числа, не превосходящих $100$ — количество пассажиров в первой, второй и третьей маршрутках соответственно.

Выходные данные

Выведите одно число — наименьшее количество пассажиров, которое требуется пересадить. Если это невозможно, выведите слово [latex]IMPOSSIBLE[/latex]  (заглавными буквами).

Тесты

Ввод Вывод
1 1 2 3 1
2 100 100 99 IMPOSSIBLE
3 100 100 100 0
4 19 59 6 31
5 30 9 74 IMPOSSIBLE

Код программы (Линейные вычисления)

Решение

В начале выводим полную формулу. Для этого находим, сколько пассажиров должно быть в одном автобусе после всех перестановок : $\frac{b_1 + b_2 + b_3}{3}$. Далее, от количества пассажиров в каждом автобусе изначально отнимаем требуемое значение. Так как оно может отличаться как в плюс, так и в минус используем модуль : $|b_1-need|+|b_2-need|+|b_3-need|$. А так как «излишки» перераспределяются между оставшимися двумя автобусами, то чтобы избежать повторения мы делим все на $2$ : $\frac{|b_1-need|+|b_2-need|+|b_3-need|}{2}$.

Далее мы вычисляем, существует ли остаток от деления общего количества пассажиров на $3$; для этого используем логическую переменную. Если остаток существует и  f == true, то  выводится [latex]IMPOSSIBLE[/latex].  Если же f == false, то вычисляется и выводится количество перестановок пассажиров.

Код программы (Ветвление)

Решение

Алгоритм решения в данном случае полностью повторяет предыдущий, но с помощью условного оператора мы можем сразу же проверить сумму пассажиров на делимость, вывести [latex]IMPOSSIBLE[/latex] и завершить программу не вычисляя формулы.

Ссылки

Условие задачи на E-Olymp
Код программы на IdeOne (Линейные вычисления)
Код программы на IdeOne (Ветвление)

Related Images:

5 thoughts on “e-olymp 8352. Такси

  1. f — значение логического типа. И (f == 1) — значение логического типа, кстати совпадающее с f. Так что можно написать просто f или !f.

    Правда, во многих соглашениях о стиле кода принято писать со знаком равенства, но это делается для большей читаемости. Тогда логичнее было бы писать (f == true), потому что лично меня выражение f == 1 поставило в тупик, пока я не понял, что остаток от деления сохраняется в логическую переменную. В большом проекте в этом месте сидел бы потенциальный баг.

    • В чем смысл return 0; внутри условного оператора?
    • В тех местах, где Вы описываете алгоритм, используйте математические обозначения, например, $b_1$. Когда рассказываете о коде, используйте разметку кода (тег code) — f==1. Но в любом случае, объясняйте свои обозначения и не перемешивайте код и математику в одной формуле.
    • Про разметку кода учту, большое спасибо. А return 0; там и правда был не нужен.

    • Точно. Теперь не нужны и фигурные скобки.
      Собственно, они не мешают. Просто Вы их в одном случае ставите, а в другом точно таком же нет.
      Определитесь

Добавить комментарий