Тема 26. Программирование - Обработка целочисленной информации с использованием сортировки
26.01 Подарочные коробки
Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование - обработка целочисленной информации с использованием сортировки
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#56332

В магазине для упаковки подарков есть N  кубических коробок. Самой интересной считается упаковка подарка по принципу матрёшки – подарок упаковывается в одну из коробок, та в свою очередь в другую коробку и т.д. Одну коробку можно поместить в другую, если длина её стороны хотя бы на 3  единицы меньше длины стороны другой коробки. Определите наибольшее количество коробок, которое можно использовать для упаковки одного подарка, и максимально возможную длину стороны самой маленькой коробки, где будет находиться подарок. Размер подарка позволяет поместить его в самую маленькую коробку.

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

В первой строке входного файла находится число N  – количество коробок в магазине (натуральное число, не превышающее 10000  ). В следующих N  строках находятся значения длин сторон коробок (все числа натуральные, не превышающие 10000  ), каждое – в отдельной строке. Запишите в ответе два целых числа: сначала наибольшее количество коробок, которое можно использовать для упаковки одного подарка, затем максимально возможную длину стороны самой маленькой коробки в таком наборе.

Типовой пример организации данных во входном файле

5

21

19

13

31

40

Пример входного файла приведён для пяти коробок и случая, когда минимальная допустимая разница между длинами сторон коробок, подходящих для упаковки «матрёшкой», составляет 3  единицы. При таких исходных данных условию задачи удовлетворяют наборы коробок с длинами сторон 40,31,21  и 13  или 40,31,19  и 13  соответственно, т.е. количество коробок равно 4  , а длина стороны самой маленькой коробки равна 13  .

Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.

Вложения к задаче
Показать ответ и решение

Решение 1 (Excel/LibreOffice)
Откроем текстовый документ, скопируем значения и перенесем их в Excel или LibreOffice.
Перенесем числовые значение количества коробок в магазине куда-нибудь, где оно нам не помешает. Сортируем числа столбца A  по убыванию. Выделим полностью столбец A  , перейдём в раздел Данные и нажимаем на инструмент Удалить дубликаты, в появившемся окне выбираем Выделить все и нажимаем ОК (это удалит коробки, которые были по записаны несколько раз). Запишем для первых ячеек максимальный размер подарка, который закончится на данной коробке. В ячейку B4  запишем формулу =МАКС(ЕСЛИ(A3-A4>=3;B3+1;1);ЕСЛИ(A2-A4>=3;B2+1;1);ЕСЛИ(A1-A4>=3;B1+1;1)), скопируем её на все свободные клеточки этого столбца. Находим маскимальное значение в столбце B  . Выписываем в ответ наибольшее количество коробок, которое можно использовать для упаковки одного подарка, затем максимально возможную длину стороны самой маленькой коробки в таком наборе.

Решение 2 (Python)

f = open(’Задание 26.txt’)
n = int(f.readline())
a=[int(x) for x in f.readlines()]
a.sort(reverse=True)
gift = [a[0]]
for i in range(n):
    if gift[-1] - a[i] >= 3:
        gift.append(a[i])
print(len(gift), gift[-1])

Ответ: 2787 51

Ошибка.
Попробуйте повторить позже

Задача 2#56331

Источник: КЕГЭ2022

В магазине для упаковки подарков есть N  кубических коробок. Самой интересной считается упаковка подарка по принципу матрёшки – подарок упаковывается в одну из коробок, та в свою очередь в другую коробку и т.д. Одну коробку можно поместить в другую, если длина её стороны хотя бы на 3 единицы меньше длины стороны другой коробки. Определите наибольшее количество коробок, которое можно использовать для упаковки одного подарка, и максимально возможную длину стороны самой маленькой коробки, где будет находиться подарок. Размер подарка позволяет поместить его в самую маленькую коробку.

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

В первой строке входного файла находится число N – количество коробок в магазине (натуральное число, не превышающее 10 000). В следующих N строках находятся значения длин сторон коробок (все числа натуральные, не превышающие 10 000), каждое – в отдельной строке. Запишите в ответе два целых числа: сначала наибольшее количество коробок, которое можно использовать для упаковки одного подарка, затем максимально возможную длину стороны самой маленькой коробки в таком наборе.

Типовой пример организации данных во входном файле

5

43

40

32

40

30

Пример входного файла приведён для пяти коробок и случая, когда минимальная допустимая разница между длинами сторон коробок, подходящих для упаковки «матрёшкой», составляет 3 единицы. При таких исходных данных условию задачи удовлетворяют наборы коробок с длинами сторон 30, 40 и 43 или 32, 40 и 43 соответственно, т.е. количество коробок равно 3, а длина стороны самой маленькой коробки равна 32.

Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.

Вложения к задаче
Показать ответ и решение

Решение 1 (Excel/LibreOffice)
Откроем текстовый документ, скопируем значения и перенесем их в Excel или LibreOffice.
Перенесем числовые значение количества коробок в магазине куда-нибудь, где оно нам не помешает. Сортируем числа столбца A  по убыванию. Выделим полностью столбец A  , перейдём в раздел Данные и нажимаем на инструмент Удалить дубликаты, в появившемся окне выбираем Выделить все и нажимаем ОК (это удалит коробки, которые были по записаны несколько раз). Запишем для первых ячеек максимальный размер подарка, который закончится на данной коробке. В ячейку B4  запишем формулу =МАКС(ЕСЛИ(A3-A4>=3;B3+1;1);ЕСЛИ(A2-A4>=3;B2+1;1);ЕСЛИ(A1-A4>=3;B1+1;1)), скопируем её на все свободные клеточки этого столбца. Находим маскимальное значение в столбце B  . Выписываем в ответ наибольшее количество коробок, которое можно использовать для упаковки одного подарка, затем максимально возможную длину стороны самой маленькой коробки в таком наборе.

Решение 2 (Python)

f = open(’Задание 26.txt’)
n = int(f.readline())
a=[int(x) for x in f.readlines()]
a.sort(reverse=True)
gift = [a[0]]
for i in range(n):
    if gift[-1] - a[i] >= 3:
        gift.append(a[i])
print(len(gift), gift[-1])

Ответ: 2767 51

Ошибка.
Попробуйте повторить позже

Задача 3#56327

Задание выполняется с использованием прилагаемых файлов

В магазине для упаковки подарков есть N кубических коробок. Самой интересной считается упаковка подарка по принципу матрёшки – подарок упаковывается в одну из коробок, та в свою очередь в другую коробку и т.д. Одну коробку можно поместить в другую, если длина её стороны хотя бы на 5  единиц меньше длины стороны другой коробки. Определите наибольшее количество коробок, которое можно использовать для упаковки одного подарка, и максимально возможную длину стороны самой маленькой коробки, где будет находиться подарок. Размер подарка позволяет поместить его в самую маленькую коробку.

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

В первой строке входного файла находится число N – количество коробок в магазине (натуральное число, не превышающее 10000  ). В следующих N строках находятся значения длин сторон коробок (все числа натуральные, не превышающие 10000  ), каждое – в отдельной строке.

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

Пример организации данных во входном файле

5

43

40

32

40

30

Пример входного файла приведён для пяти коробок и случая, когда минимальная допустимая разница между длинами сторон коробок, подходящих для упаковки «матрёшкой», составляет 3  единицы.

При таких исходных данных условию задачи удовлетворяют наборы коробок с длинами сторон 30  , 40  и 43  или      32  , 40  и 43  соответственно, т.е. количество коробок равно 3  , а длина стороны самой маленькой коробки равна 32  .

Вложения к задаче
Показать ответ и решение
f = open(’26.txt’)
n = int(f.readline())
a = sorted([int(s) for s in f], reverse=True)
ans = 1
x = a[0]
minim = ’’
for i in range(1, len(a)):
    if (x - a[i]) >= 5:
        ans += 1
        x = a[i]
print(ans, x)

 

Ответ: 174 10

Ошибка.
Попробуйте повторить позже

Задача 4#56169

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

а) размер стороны внешнего контейнера превышает размер стороны внутреннего на K  и более условных единиц

б) цвета внешнего и внутреннего контейнеров различны. Группу вложенных друг в друга контейнеров называют блоком. Количество контейнеров в блоке может быть любым.

Каждый блок, независимо от количества и размера входящих в него контейнеров, а также каждый одиночный контейнер, не входящий в блоки, занимает при хранении одну складскую ячейку.

Определите минимальное количество ячеек, которые потребуются для хранения всех контейнеров, и максимальное количество контейнеров в одном блоке.

Входные данные:

В первой строке входного файла записано натуральное число N  (1 ≤ N ≤ 20000)  – количество контейнеров, натуральное число 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  .

Вложения к задаче
Показать ответ и решение
n, k  = map(int, input().split())

all = []
for i in range(n):
    num, color = input().split()
    all.append([int(num), color])

all = sorted(all)[::-1]

ans = []

while True:
    if all[0][0] == 0:
        break

    # [длина, цвет]
    chain = [ all[0] ]
    all.pop(0)
    all.append([0, 0])

    i = 0
    while i < len(all):
        if all[i][0] == 0:
            break

        if all[i][1] != chain[-1][1]:
            if chain[-1][0] - all[i][0] >= k:
                chain.append(all[i])
                all.pop(i)
                all.append([0, 0])
                i -= 1
        i += 1

    ans.append(chain)


print(len(ans), max( [len(x) for x in ans ] ))

Ответ: 25 2093

Ошибка.
Попробуйте повторить позже

Задача 5#56168

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

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

Определите минимальное количество ячеек, которые потребуются для хранения всех контейнеров, и максимальное количество контейнеров в одном блоке.

Входные данные:

В первой строке входного файла записано число N  – количество контейнеров (натуральное число, не превышающее 20000  ) и число K  (1 ≤ K ≤ 1000)  – наименьшая допустимая разница размеров вложенных соседних контейнеров. Каждая из следующих N  строк содержит одно натуральное число, не превышающее 10000  – длину стороны очередного контейнера.

Пример:

7 9

2

18

47

16

38

55

48

Для таких контейнеров можно составить три блока, удовлетворяющих условию: (55,38,18,2)  , (48,16)  и (47)  . Наибольшее количество контейнеров – в первом блоке – 4  . Ответ: 3 4  .

Вложения к задаче
Показать ответ и решение
n, k  = map(int, input().split())

all = []
for i in range(n):
    num = int(input())
    all.append(num)

all = sorted(all)[::-1]

ans = []

while True:
    if all[0] == 0:
        break

    # [длина, цвет]
    chain = [ all[0] ]
    all.pop(0)
    all.append(0)

    i = 0
    while i < len(all):
        if all[i] == 0:
            break

        if chain[-1] - all[i] >= k:
            chain.append(all[i])
            all.pop(i)
            all.append(0)
            i -= 1
        i += 1

    ans.append(chain)


print(len(ans), max( [len(x) for x in ans ] ))

Ответ: 19 1045

Ошибка.
Попробуйте повторить позже

Задача 6#56167

Транспортная компания владеет автомобилями с грузоподъемность M  . Для транспортировки N  грузов автомобили загружают предметами по убыванию веса, пока общая масса предметов не превышает грузоподъемность M  . И далее процедуру повторяют для другого грузовика, до тех пор, пока все предметы не будут погружены.

Нужно определить количество автомобилей для транспортировки всех предметов и общую загрузку предпоследнего автомобиля.

Входные данные:

В первой строке записаны два числа – количество грузов N  и грузоподъёмность автомобиля M  . В каждой из следующих N  строк записано по одному натуральному числу, обозначающему вес груза.

Пример:

6 100

30

10

40

50

10

20

В первый автомобиль будут погружены грузы весом 50  , 40  и 10  , во второй – грузы весом 30,20,10  . Ответ:   2  100.

Вложения к задаче
Показать ответ и решение
n, m  = map(int, input().split())

all = []
for i in range(n):
    num = int(input())
    all.append(num)

all = sorted(all)[::-1]

ans = []

while True:
    if all[0] == 0:
        break

    # [длина, цвет]
    chain = [ all[0] ]
    all.pop(0)
    all.append(0)

    i = 0
    while i < len(all):
        if all[i] == 0:
            break

        if sum(chain) + all[i] <= m:
            chain.append(all[i])
            all.pop(i)
            all.append(0)
            i -= 1
        i += 1

    ans.append(chain)


print(len(ans), sum(ans[-2]) )

Ответ: 38 1481

Ошибка.
Попробуйте повторить позже

Задача 7#54782

В магазине для упаковки подарков есть N  кубических коробок и M  декоративных замочков к ним (M  < N ).  Самой интересной считается упаковка подарка по принципу матрёшки - подарок упаковывается в одну из коробок, та в свою очередь в другую коробку и т. д., при этом к каждой коробке подбирается подходящий замочек. Одну коробку можно поместить в другую, если длина её стороны хотя бы на 6  единиц меньше длины стороны другой коробки. Замочек подходит к коробке, если маркировка замочка совпадает с длиной стороны коробки. Определите наибольшее количество коробок, которое можно использовать для упаковки одного подарка, и максимально возможную длину стороны самой маленькой коробки, где будет находиться подарок. Размер подарка позволяет поместить его в самую маленькую коробку.

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

В первой строке входного файла находятся число N  - количество коробок в магазине (натуральное число, не превышающее 10  000  ) и через пробел число M  - количество декоративных замочков в магазине (натуральное число, не превышающее 10  000  ).

В следующих N  строках находятся значения длин сторон коробок (все числа натуральные, не превышающие  10  000  ) и через знак табуляции значения, указанные как маркировки на замочках (все числа натуральные, не превышающие 10  000  ), каждая пара таких значений - в отдельной строке; в последних N − M  строках второе число, соответствующее маркировке замочка, опускается, и числа, соответствующие длинам сторон коробок, идут каждое в отдельной строке.

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

Типовой пример организации данных во входном файле

5 4

43 40

31 30

32 43

40 31

30

Пример входного файла приведён для случая пяти коробок и четырёх замочков, когда минимальная допустимая разница между длинами сторон коробок, подходящих для упаковки "матрёшкой составляет 3  единицы.

При таких исходных данных условию задачи удовлетворяют набор коробок с длинами сторон 30  , 40  и 43  или 31  , 40  и 43  или 32  , 40  и 43  соответственно, т.е. количество коробок равно 3  , а длина стороны самой маленькой коробки равна 31  (поскольку замочка для коробки с длиной стороны 32  в магазине нет).

Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемых файлов.

Вложения к задаче
Показать ответ и решение
f = open(’26.txt’)
n, m = map(int, f.readline().split())
length = []
locks = set()
for i in range(m):
    x, y = map(int, f.readline().split())
    length.append(x)
    locks.add(y)
for i in range(n - m):
    x = int(f.readline())
    length.append(x)
length = sorted([i for i in length if i in locks], reverse=True)
ans = 1
x = length[0]
for i in range(1, len(length)):
    if (x - length[i]) >= 6:
        ans += 1
        x = length[i]
print(ans, x)

Ответ: 650 103
Рулетка
Вы можете получить скидку в рулетке!