Задача к ЕГЭ по информатике на тему «задачи под вебы» №36

Задача с сайта https://kpolyakov.spb.ru/

На складе требуется разместить N  контейнеров различного размера, каждый из которых имеет форму куба. Контейнеры имеют разные цвета, которые обозначаются латинскими буквами. Чтобы сэкономить место, контейнеры вкладывают друг в друга. Один контейнер можно вложить в другой, если а) размер стороны внешнего контейнера превышает размер стороны внутреннего на K  и более условных единиц и б) цвета внешнего и внутреннего контейнеров различны. Группу вложенных друг в друга контейнеров называют блоком. Количество контейнеров в блоке может быть любым. Каждый блок, независимо от количества и размера входящих в него контейнеров, а также каждый одиночный контейнер, не входящий в блоки, занимает при хранении одну складскую ячейку. Определите минимальное количество ячеек, которые потребуются для хранения всех контейнеров, и максимальное количество контейнеров в одном блоке.

Входные данные представлены в файле 26-102.txt следующим образом. В первой строке входного файла записано число N  – количество контейнеров (натуральное число, не превышающее 20 000) и число K  (1 ≤ K ≤ 1000  ) – наименьшая допустимая разница размеров вложенных соседних контейнеров. Каждая из следующих N  строк содержит натуральное число, не превышающее 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)

Ответ: 25 2093
Оцените статью
Я решу все!