На складе хранятся кубические контейнеры двух цветов различного
Условие
На складе хранятся кубические контейнеры двух цветов различного размера. Чтобы сократить занимаемое при хранении место, контейнеры вкладывают друг в друга. Чтобы вложенные контейнеры было лучше видно, их цвета при вложении обязательно должны чередоваться, то есть нельзя вкладывать контейнер в контейнер такого же цвета. Один контейнер можно вложить в другой, если размер стороны внешнего контейнера превышает размер стороны внутреннего на 5 и более условных единиц. Группу вложенных друг в друга контейнеров называют блоком. Количество контейнеров в блоке может быть любым. Каждый блок, независимо от количества и размера входящих в него контейнеров, а также каждый одиночный контейнер, не входящий в блоки, занимает при хранении одну складскую ячейку.
Зная размеры и цвета всех контейнеров, определите максимально возможное количество контейнеров в одном блоке и минимальное количество ячеек для хранения всех контейнеров.
Задание 26Входные данные.
Каждая строка входного файла содержит натуральное число и букву A или B.Число обозначает размер контейнера в условных единицах, буква — цвет этого контейнера (буквами A и B условно обозначены два цвета).В ответе запишите два целых числа: сначала максимально возможное количество контейнеров в одном блоке, затем минимальное количество ячеек для хранения всех контейнеров. Ответ:
Ответ
Ответ и полный разбор откроются после входа
Посмотреть ответРешение по шагам
Как рассуждать
Решение. Приведем решение на языке Python.from sys import setrecursionlimitsetrecursionlimit(5000)f = [[int(t[0]), t[1]] for i in open('26.txt').readlines() if (t:=i.split())]spiblock = [] def creat_block(li, nvk, pb, f=''): lila = len(li); global spiblock for i, a in enumerate(li): if a[1] == f and pb - a[0] >= 5: del li[i]; nvk += 1; pd = a[0]; break if lila != len(li): creat_block(li, nvk, pd, ('A' if f == 'B' else 'B')) else: spiblock += [[li, nvk]]; return 0 vk, m = 0, 0while f: u = [i[1] for i in f] if 'A' in u and 'B' in u: f = sorted(f)[::-1]; M = f[0]; f = f[1:] creat_block(f, 1, M[0], ('A' if M[1] == 'B' else 'B')) t = spiblock[-1] f, vk, m = t[0], max(vk, t[1]), m + 1 else: m += len(f); f.clear() print(vk, m)
Осталось ещё 1 шаг
Приведем решение Михаила Зорина на языке…
Бесплатно · займёт минуту