Задача с сайта https://kpolyakov.spb.ru/
На складе требуется разместить контейнеров различного размера, каждый из которых имеет форму куба. Контейнеры имеют разные цвета, которые обозначаются латинскими буквами. Чтобы сэкономить место, контейнеры вкладывают друг в друга. Один контейнер можно вложить в другой, если а) размер стороны внешнего контейнера превышает размер стороны внутреннего на
и более условных единиц и б) цвета внешнего и внутреннего контейнеров различны. Группу вложенных друг в друга контейнеров называют блоком. Количество контейнеров в блоке может быть любым. Каждый блок, независимо от количества и размера входящих в него контейнеров, а также каждый одиночный контейнер, не входящий в блоки, занимает при хранении одну складскую ячейку. Определите минимальное количество ячеек, которые потребуются для хранения всех контейнеров, и максимальное количество контейнеров в одном блоке.
Входные данные представлены в файле 26-102.txt следующим образом. В первой строке входного файла записано число – количество контейнеров (натуральное число, не превышающее 20 000) и число
(
) – наименьшая допустимая разница размеров вложенных соседних контейнеров. Каждая из следующих
строк содержит натуральное число, не превышающее 10000 – длину стороны очередного контейнера, и латинскую букву, обозначающую цвет этого контейнера.
Пример входного файла:
7 5
2 A
18 B
47 A
16 B
38 A
55 A
48 B
Для такого набора контейнеров можно составить два блока, удовлетворяющих условию: (55, 48, 38, 18, 2), (47, 16). Наибольшее количество контейнеров – в первом блоке – 5. Ответ: 2 5.
f = open(’26-102.txt’)
n, k = map(int, f.readline().split())
b = [i.split() for i in f]
a = []
for i in b:
a.append([int(i[0]), i[1]])
a.sort(reverse=True)
bloks = [] # Список блоков
mx = 0 # Максимальное количество контейнеров в блоке
while a: # Пока список ’a’ не пустой
# Добавляем контейнер в новый блок и удаляем из списка ’a’
bloks.append([a.pop(0)])
for i in bloks[-1]: # Перебираем контейнеры в текущем блоке
for j in a: # Перебираем оставшиеся контейнеры
# Если разница между контейнерами не меньше ’k’ и цвета различны
if (i[0] - j[0] >= k) and (i[1] != j[1]):
bloks[-1].append(j) # Добавляем контейнер в текущий блок
a.remove(j) # Удаляем контейнер из списка оставшихся
break # Переходим к следующему контейнеру
# Обновляем максимальное количество контейнеров в блоке
mx = max(mx, len(bloks[-1]))
# Kоличество блоков и максимальное количество контейнеров в одном блоке
print(len(bloks), mx)