N. Это будет шедевр!

Главный повар детского сада хочет быстрее выбирать блюда для готовки.
В его распоряжении есть список продуктов, а также набор блюд.

Напишите программу, способную быстро определить блюда, которые можно приготовить.

Формат ввода

Число продуктов (N), которые имеются в наличии.
N строк с названиями продуктов.
Число рецептов (M), о которых имеется информация.
M блоков строк для каждого из рецептов.
В первой строке каждого блока записано название блюда.
Во второй — число ингредиентов.
Затем перечисляются сами ингредиенты, требуемые для приготовления блюда.

Формат вывода:

Список блюд, которые можно приготовить в алфавитном порядке.
Если ни одно из блюд нельзя приготовить, следует вывести «Готовить нечего».

Пример

Ввод

4
Яблоки
Хлеб
Варенье
Картошка
3
Тосты
2
Хлеб
Варенье
Яблочный Сок
1
Яблоки
Яичница
1
Яйца

Вывод

Тосты
Яблочный Сок

Ввод

1
хлеб
1
бутерброд
2
масло
хлеб

Вывод

Готовить нечего

Решение

Накапливаем названия продуктов в список.
В цикле считываем название блюда и в отдельный список ингредиенты, которые нужны для его приготовления. Заносим собранную информацию в словарь, где ключом служит название блюда, а значением список ингредиентов.
После того, как собрали информацию о всех рецептах, перебираем все рецепты и проверяем, что ингредиентов хватает на то, чтобы приготовить блюдо. Если это так, добавляем блюдо в меню.
Если меню не пустое, сортируем его и выводим каждое блюдо на новой строке. В противном случае, выводим сообщение о том, что готовить нечего.

Единственная сложность – выбор правильного способа определения возможности приготовить блюдо из ингредиентов в наличии. Есть соблазн просто вычесть множество необходимых для приготовления блюда ингредиентов из множества всех ингредиентов. Этот способ успешно пройдет проверку, но это алгоритмически неправильный способ и он проходит проверку просто потому, что в тестах не хватает, например, такого сценария:

2
хлеб
масло
1
бутерброд
2
масло
хлеб

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

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

Посмотреть код

Решение

Python
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('Готовить нечего')
Подписаться
Уведомить о
guest
5 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии