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{b1 + b2 + b3}{3}$. Далее, от количества пассажиров в каждом автобусе изначально отнимаем требуемое значение. Так как оно может отличаться как в плюс, так и в минус используем модуль : $|b1-need|+|b2-need|+|b3-need|$. А так как «излишки» перераспределяются между оставшимися двумя автобусами, то чтобы избежать повторения мы делим все на $2$ : $\frac{|b1-need|+|b2-need|+|b3-need|}{2}$.

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

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

Решение

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

Ссылки

Условие задачи на E-Olymp

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

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

 

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

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

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

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

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