Подготовка к школе
1 класс
2 класс
3 класс
4 класс
5 класс
6 класс
7 класс
8 класс
9 класс
10 класс
11 класс
ОГЭ
ЕГЭ
Для всех
Назад

26. Прикладная задача: #298093

Сообщить о проблеме
Задание #298093
Задание было решено верно
Задание было решено неверно

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

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

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

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

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

5
43
40
32
40
30

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

Отсортируем длины сторон по возрастанию. Матрёшка — это цепочка, в которой каждая следующая коробка больше предыдущей хотя бы на $6$. Максимальную длину даёт обычная жадность: идём по возрастанию и берём коробку, если она подходит к последней взятой.

Со вторым вопросом жадность не справляется: она стартует с самой маленькой коробки, а нам нужна самая большая из возможных стартовых. Поэтому для каждой коробки считаем $ln[i]$ — длину максимальной цепочки, которая начинается именно с неё.

Работает удобное свойство: чем меньше коробка, тем длиннее цепочка от неё, потому что любую цепочку, начинающуюся с большей коробки, можно начать и с меньшей. Значит $ln$ не возрастает по мере роста стороны, и максимум среди подходящих продолжений достигается на самой первой коробке со стороной не менее $a_i + 6$. Её и находим двоичным поиском, а массив заполняем справа налево.

Затем берём $K$ — наибольшее значение в $ln$, и среди всех коробок с таким значением выбираем самую большую сторону.

from bisect import bisect_left

f = open('26-28.txt')
n = int(f.readline())
a = sorted(int(f.readline()) for _ in range(n))

ln = [1] * n                       # длина макс. цепочки, начинающейся с i-й коробки
for i in range(n-1, -1, -1):
    j = bisect_left(a, a[i] + 6)   # первая коробка, в которую влезет i-я
    if j < n:
        ln[i] = 1 + ln[j]

K = max(ln)
smallest = max(a[i] for i in range(n) if ln[i] == K)

print(K, smallest)   # 1511 54

Проверка. В файле $10000$ коробок со сторонами от $50$ до $9998$, жадный подсчёт тоже даёт цепочку из $1511$ коробок. Стартовать можно с любой коробки от $50$ до $54$ — все дают ровно $1511$ звеньев, а со следующей уже только $1510$. Поэтому в ответ идёт наибольшая из подходящих, то есть $54$. На типовом примере из условия с разницей $3$ программа выдаёт $3$ и $32$.

Показать
Очки опыта 20
Спросить Зави
0 заданий сегодня

Предложить улучшение