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

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

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

Решение задания проиллюстрировано на рисунке ниже.



PascalABC.NET

##

var F:=ReadAllText('26.txt').ToIntegers[1:].SortedDescending.ToArray;

var (count,max_len):=(1,F[0]);

foreach var i in Range(1,F.Count-1) do

  if max_len-F[i]>=3 then begin

    count+=1;

    max_len:=F[i]; end;

 

print(count,max_len);
Python

F=list(map(int,open('26.txt')))

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

 

count, max_len = 1, F[0]

for i in range(1,len(F)):

     if max_len-F[i]>=3:

          count+=1

          max_len=F[i]

 

print(count, max_len)
Решение А.Богданова на PascalABC.NET

ReadAllText('26.txt').ToIntegers[1:].OrderDescending

.Aggregate((0,maxint),

     (\(k,p),x) -> p-x>=3 ? (k+1,x):(k,p))

.Print


    Рассмотрим решение в PascalABC.NET. Считываем все строки из файла в переменную F функцией ReadAllText, метод ToIntegers, совмещённый со срезом [1:] преобразует каждое число из строкового значения в целочисленное, начиная со второго элемента (первое число – количество коробок). Сортируем последовательность по убыванию функцией SortedDescending и преобразуем последовательность в массив методом ToArray (чтобы использовать некоторые методы динамических массивов).

    Введём переменные count и max_len, запоминающие количество вложенных коробок и длину первой коробки соответственно. Будем проходить от самой большой коробки к самой маленькой и проверять условие: если разница длины коробки max_len и длины текущей коробки F[i] не меньше трёх, коробку можно поместить внутрь большей коробки: count увеличиваем на 1, max_len=F[i]. В ответе выводим count и max_len.

    Решение на Python аналогичное: считываем из файла в переменную F значения конструкцией list(map(int,open('26.txt'))). Функция sorted(F[1:]) сортирует список, отбрасывая первый элемент. Срез [::-1] переворачивает список. Далее решение аналогично решению на PascalABC.NET.

    Также на рисунке представлено решение А.Богданова с помощью агрегатной функции Aggregate. Функция Aggregate нужна, когда необходимо накапливать какие-то значения, проходя по элементам перечислимого типа данных.

    Первая строка считывает числа из файла. В функции Aggregate определим начальное значение как кортеж из двух значений (0, maxint). Это, соответственно, количество коробок и максимальная длина минимальной коробки. Далее указано лямбда-выражение агрегатной функции, в котором мы распаковываем значения кортежа в переменные k и p, а переменная x берёт значения из последовательности чисел файла. Тернарный оператор в правой части лямбда-выражения проверяет, если разница максимальной длины коробки p и текущей длины x не меньше трёх, то исходный кортеж заменяем на изменённый кортеж (k+1, p), иначе оставляем кортеж прежним (k, p). В ответе получится кортеж из двух значений: количество коробок и максимальная длина минимальной коробки.



Modifié le: lundi 29 mai 2023, 16:45