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
7 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Saper06
Saper06
09.06.2024 17:01

ingredients = []
menu = []
recipes = dict()

for _ in range(int(input())):
    ingredients.append(input())

for _ in range(int(input())):
    dish = input()
    recipes[dish] = []
    for _ in range(int(input())):
        ingredient = input()
        recipes[dish] += [ingredient]

for dish in recipes:
    if set(recipes[dish]) <= set(ingredients):
        menu.append(dish)
       
if menu:
    menu.sort()
    for plate in menu:
        print(plate)
else:
    print(‘Готовить нечего’)

Суть та же, но не пересечением. Вроде логично.

Ilya
Ilya
18.07.2024 19:41

Подскажите, пожалуйста, почему не работает?
Первые 2 проверки проходит, на третьей спотыкается, а при каких вводных – непонятно.
products = []
ingredients = []
menu = []
presence = True
for _ in range(int(input())):
  products.append(product := input())

for _ in range(recepies := int(input())):
  recepiet = input()
   
  for _ in range(int(input())):
    ingredients.append(input())
   
  for ingredient in ingredients:   
    if ingredient not in products:
      presence = False
   
  if presence:
    menu.append(recepiet)
   
  presence = True

menu.sort()   

if not menu:
  print(‘Готовить нечего’)
else:
  for recepiet in menu:
    print(recepiet)

Илья
Илья
Ответить на  Сергей Клочко
18.07.2024 21:21

Спасибо!

Иван
Иван
06.11.2024 15:20

have_prod = set()
ans = []
counter = 0
products = int(input())
for _ in range(products) :
have_prod.add(input())
recepies = int(input())
for _ in range(recepies) :
recepy_name = input()
products_num = int(input())
for _ in range(products_num) :
recepy_product = input()
if recepy_product in have_prod:
counter += 1
if counter == products_num:
ans. append(recepy_name)
counter = 0
if ans:
ans.sort()
for el in ans:
print(el)
else:
print(“Готовить нечего “)

А можно так сделать? Вроде по видимым примерами работает, мы проверяем, есть ли продукт из рецепта в списке имеющихся продуктов, если есть то счётчик увеличивается на один, если значение счётчика равно количеству продуктов в рецепте(то есть все продукты из рецепта есть в имеющихся продуктах), то добавляем имя рецепта в ответ. Обнуляем счётчик, и проверяем следующий рецепт.