Задача #1964
Исполнитель Черепаха
(Е.Джобс) Исполнитель Водолей переливает воду между тремя колбами А, В и С.
Водолей имеет три команды: Наполни А/В/С - наполняет одну из колб, указанную в команде (например, команда Наполни А полностью наполняет колбу А); Вылей А/В/С - опустошает одну из колб, указанную в команде (например, команда Вылей С опустошит колбу С).; Перелей из А/В/С в А/В/С - переливает воду из колбы_1, название которой указано после слова "из", в колбу_2, имя которой указано после слова "в". Если колба_2 может поместить весь объем воды из колбы_1, то переливается вся вода, если нет, только то количество, которое колба_2 может вместить, не поместившийся в колбу_2 объем, остается в колбе_1.
Запись Повтори k раз Команды конец означает, что последовательность Команд повторится k раз.
Колба А имеет объем 7 литра, В – 5 литров, С – 11 литра. В колбе В налито 3 литра воды.
Исполнителю был задан следующий алгоритм:
Повтори N раз
Наполни А
Перелей из А в B
Вылей B
Перелей из А в C
Перелей из А в B
Конец
Найдите минимальное N, при котором после выполнения алгоритма суммарный объем воды в трех колбах будет максимально возможным (или такой суммарный объем, больше которого получить не удастся одним лишь изменением значения N).
Решение
Ответ
colbes = {'A': 0, 'B': 3, 'C': 0}
mx = {'A': 7, 'B': 5, 'C': 11}
a, b, c = 'ABC'
def наполни(n):
colbes[n] = mx[n]
def вылей(n):
colbes[n] = 0
def перелей(a, b):
if colbes[b] + colbes[a] <= mx[b]:
colbes[b] += colbes[a]
colbes[a] = 0
else:
v = mx[b] - colbes[b]
colbes[b] = mx[b]
colbes[a] -= v
for N in range(12):
colbes = {'A': 0, 'B': 3, 'C': 0}
for _ in range(N):
наполни(a)
перелей(a, b)
вылей(b)
перелей(a, c)
перелей(a, b)
print(N, colbes, sum(colbes.values()))

Заметим, что со значения N=8 конечное состояние колб не изменяется. При этом же значении получается максимальный суммарный объем.