Главный повар детского сада хочет быстрее выбирать блюда для готовки.
В его распоряжении есть список продуктов, а также набор блюд.
Напишите программу, способную быстро определить блюда, которые можно приготовить.
Формат ввода
Число продуктов (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('Готовить нечего')
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(‘Готовить нечего’)
Суть та же, но не пересечением. Вроде логично.
Здравствуйте, да, неплохое рабочее решение.
Подскажите, пожалуйста, почему не работает?
Первые 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)
Все дело в том, что если в ингредиенты хоть раз попадет неправильный ингредиент, то ваш код всегда будет давать ответ, что готовить нечего.
А все потому что после того, как вы проверили все ингредиенты на наличие в продуктах вы не обнуляете список имеющихся ингредиентов. В итоге ваш список ингредиентов бесконечно растет.
Спасибо!
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(“Готовить нечего “)
А можно так сделать? Вроде по видимым примерами работает, мы проверяем, есть ли продукт из рецепта в списке имеющихся продуктов, если есть то счётчик увеличивается на один, если значение счётчика равно количеству продуктов в рецепте(то есть все продукты из рецепта есть в имеющихся продуктах), то добавляем имя рецепта в ответ. Обнуляем счётчик, и проверяем следующий рецепт.
Лучше код вставлять с помощью виджета кода. Тогда не будет уезжать форматирование. Пока, к сожалению, форматировать ваш код можно сильно разными способами, и проверить его по этой причине довольно сложно.
Но на словах это вполне рабочий способ проверить получится ли приготовить блюдо.