Главный повар детского сада хочет быстрее выбирать блюда для готовки.
В его распоряжении есть список продуктов, а также набор блюд.
Напишите программу, способную быстро определить блюда, которые можно приготовить.
Формат ввода
Число продуктов (N), которые имеются в наличии.
N строк с названиями продуктов.
Число рецептов (M), о которых имеется информация.
M блоков строк для каждого из рецептов.
В первой строке каждого блока записано название блюда.
Во второй — число ингредиентов.
Затем перечисляются сами ингредиенты, требуемые для приготовления блюда.
Формат вывода:
Список блюд, которые можно приготовить в алфавитном порядке.
Если ни одно из блюд нельзя приготовить, следует вывести «Готовить нечего».
Пример
Ввод
4
Яблоки
Хлеб
Варенье
Картошка
3
Тосты
2
Хлеб
Варенье
Яблочный Сок
1
Яблоки
Яичница
1
Яйца
Вывод
Тосты
Яблочный Сок
Ввод
1
хлеб
1
бутерброд
2
масло
хлеб
Вывод
Готовить нечего
Решение
Накапливаем названия продуктов в список.
В цикле считываем название блюда и в отдельный список ингредиенты, которые нужны для его приготовления. Заносим собранную информацию в словарь, где ключом служит название блюда, а значением список ингредиентов.
После того, как собрали информацию о всех рецептах, перебираем все рецепты и проверяем, что ингредиентов хватает на то, чтобы приготовить блюдо. Если это так, добавляем блюдо в меню.
Если меню не пустое, сортируем его и выводим каждое блюдо на новой строке. В противном случае, выводим сообщение о том, что готовить нечего.
Единственная сложность – выбор правильного способа определения возможности приготовить блюдо из ингредиентов в наличии. Есть соблазн просто вычесть множество необходимых для приготовления блюда ингредиентов из множества всех ингредиентов. Этот способ успешно пройдет проверку, но это алгоритмически неправильный способ и он проходит проверку просто потому, что в тестах не хватает, например, такого сценария:
2
хлеб
масло
1
бутерброд
2
масло
хлеб
Правильный способ заключается в том, чтобы проверить что пересечение этих двух множеств равно множеству ингредиентов, необходимых для приготовления блюда.
Наиболее типичная ошибка, которую допускают учащиеся в этой задаче состоит в том, что список ингредиентов после проверки на возможность приготовления блюда не обнуляется.
Посмотреть код
Решение
products = []
recipes = {}
menu = []
for _ in range(int(input())):
products.append(input())
for _ in range(int(input())):
name = input()
ingredients = []
for _ in range(int(input())):
ingredients.append(input())
recipes[name] = recipes.get(name, []) + ingredients
for name in recipes:
if (set(recipes[name]) & set(products) == set(recipes[name])):
menu.append(name)
if menu:
menu.sort()
for name in menu:
print(name)
else:
print('Готовить нечего')