Такси
В час пик на остановку одновременно подъехали три маршрутных такси, следующие по одному маршруту, в которые тут же набились пассажиры. Водители обнаружили, что количество людей в разных маршрутках разное, и решили пересадить часть пассажиров так, чтобы в каждой маршрутке было поровну пассажиров. Требуется определить, какое наименьшее количество пассажиров придется при этом пересадить.
Входные данные
Три натуральных числа, не превосходящих $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 |
Код программы (Линейные вычисления)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <cmath> using namespace std; int main() { int b1, b2, b3, pas, need; bool f; cin >> b1 >> b2 >> b3; need = (b1 + b2 + b3)/3; pas = (abs(b1 - need) + abs(b2 - need) + abs(b3 - need)) / 2; f = (b1 + b2 + b3) % 3; (f == true) and cout << "IMPOSSIBLE"; (f == false) and cout << pas; return 0; } |
Решение
В начале выводим полную формулу. Для этого находим, сколько пассажиров должно быть в одном автобусе после всех перестановок : $\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, то вычисляется и выводится количество перестановок пассажиров.
Код программы (Ветвление)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream> #include <cmath> using namespace std; int main() { int b1, b2, b3, need; cin >> b1 >> b2 >> b3; need = (b1 + b2 + b3) / 3; if ((b1 + b2 + b3) % 3!=0) { cout << "IMPOSSIBLE"; } else cout << (abs(b1 - need) + abs(b2 - need) + abs(b3 - need))/2; return 0; } |
Решение
Алгоритм решения в данном случае полностью повторяет предыдущий, но с помощью условного оператора мы можем сразу же проверить сумму пассажиров на делимость, вывести [latex]IMPOSSIBLE[/latex] и завершить программу не вычисляя формулы.
Ссылки
Условие задачи на E-Olymp
Код программы на IdeOne (Линейные вычисления)
Код программы на IdeOne (Ветвление)
f — значение логического типа. И (f == 1) — значение логического типа, кстати совпадающее с f. Так что можно написать просто f или !f.
Правда, во многих соглашениях о стиле кода принято писать со знаком равенства, но это делается для большей читаемости. Тогда логичнее было бы писать (f == true), потому что лично меня выражение f == 1 поставило в тупик, пока я не понял, что остаток от деления сохраняется в логическую переменную. В большом проекте в этом месте сидел бы потенциальный баг.
Про разметку кода учту, большое спасибо. А return 0; там и правда был не нужен.
Точно. Теперь не нужны и фигурные скобки.
Собственно, они не мешают. Просто Вы их в одном случае ставите, а в другом точно таком же нет.
Определитесь
Исправила.