Задания
Версия для печати и копирования в MS Word
Тип 26 № 51995
i

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

Зная раз­ме­ры и цвета всех кон­тей­не­ров, опре­де­ли­те мак­си­маль­но воз­мож­ное ко­ли­че­ство кон­тей­не­ров в одном блоке и ми­ни­маль­ное ко­ли­че­ство ячеек для хра­не­ния всех кон­тей­не­ров.

За­да­ние 26

Вход­ные дан­ные.

Каж­дая стро­ка вход­но­го файла со­дер­жит на­ту­раль­ное число и букву A или B.

Число обо­зна­ча­ет раз­мер кон­тей­не­ра в услов­ных еди­ни­цах, буква  — цвет этого кон­тей­не­ра (бук­ва­ми A и B услов­но обо­зна­че­ны два цвета).

В от­ве­те за­пи­ши­те два целых числа: сна­ча­ла мак­си­маль­но воз­мож­ное ко­ли­че­ство кон­тей­не­ров в одном блоке, затем ми­ни­маль­ное ко­ли­че­ство ячеек для хра­не­ния всех кон­тей­не­ров.

 

Ответ:

Спрятать решение

Ре­ше­ние.

При­ве­дем ре­ше­ние на языке Python.

from sys import setrecursionlimit

setrecursionlimit(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, 0

while 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)

 

Ответ: 2326 187.

 

При­ве­дем ре­ше­ние Ми­ха­и­ла Зо­ри­на на языке Python.

n = 10000

data = []

for s in open('26.txt', 'r').readlines():

size, color = s.strip().split()

data.append([int(size), 1 if color == 'A' else 2])

data.sort()

used = [False] * n

cnt = 0

max_in_one = 0

for i in range(n):

if used[i]:

continue

cnt += 1

size, color = data[i]

used[i] = True

pile_size = 1

for j in range(i + 1, n):

if not used[j] and size + 5 <= data[j][0] and 3 - color == data[j][1]:

used[j] = True

pile_size += 1

color = 3 - color

size = data[j][0]

max_in_one = max(max_in_one, pile_size)

print(max_in_one, cnt)

 

При­ве­дем ре­ше­ние Сер­гея Морёнова на языке Python.

n = 10000

f = open('26.txt')

a=f.readlines()

boxes=[]

for s in a:

d,type=s.split()

boxes.append([int(d),type])

boxes.sort()

count_block=0

maxdepth=0

while len(boxes)>0:

block=[boxes[0]]

boxes.remove(boxes[0])

i=0

while i < len(boxes):

box=boxes[i]

if box[0]-block[-1][0] >= 5 and box[1] != block[-1][1]:

block.append(box)

boxes.remove(box)

else:

i += 1

maxdepth=max(len(block),maxdepth)

count_block+=1

print(maxdepth,count_block)


Аналоги к заданию № 51995: 52197 Все