26.03 Перевоз грузов
Ошибка.
Попробуйте повторить позже
Для перевозки партии грузов различной массы выделен грузовик, но его грузоподъёмность ограничена, поэтому
перевезти сразу все грузы не удастся. Грузы массой от 180 до 200 кг грузят в первую очередь, выбирая
грузы по убыванию массы, начиная с самого тяжёлого. На оставшееся после этого место стараются взять
как можно большее количество грузов. Если это можно сделать несколькими способами, выбирают тот
способ, при котором самый большой из выбранных грузов имеет наибольшую массу. Если и при этом
условии возможно несколько вариантов, выбирается тот, при котором наибольшую массу имеет второй по
величине груз, и т.д. Известны количество грузов, масса каждого из них и грузоподъёмность грузовика.
Необходимо определить количество и общую массу грузов, которые будут вывезены при погрузке по
вышеописанным правилам. Входные данные представлены в файле 26.txt следующим образом. В первой строке
входного файла записаны два целых числа: – общее количество грузов и
– грузоподъёмность
грузовика в кг. Каждая из следующих
строк содержит одно целое число – массу груза в кг. В ответе
запишите два целых числа без пробела: сначала максимально возможное количество грузов, затем их общую
массу.
Пример организации исходных данных во входном файле:
6 700
100
185
120
160
140
300
В данном случае сначала нужно взять груз массой 185 кг. Остается 515 кг. После этого можно вывезти ещё максимум 3 груза. Это можно сделать четырьмя способами: 100 + 120 + 140, 100 + 140 + 160, 100 + 120 + 160, 120 + 140 + 160. Выбираем способ, при котором вывозится груз наибольшей возможной массы. Таких способов три: 100 + 120 + 160, 100 + 140 + 160, 120 + 140 + 160. Из этих способов выбираем те, при которых больше масса второго по величине груза, то есть 100 + 140 + 160 и 120 + 140 + 160. Их них нужно выбрать вариант 120 + 140 + 160, так как в этом случае третий по величине груз наиболее тяжёлый. Всего получается 4 груза общей массой 605 кг.
Решение Excel:
Грузоподъемность грузовика — 10000 кг.
Скопируем все данные в Exel, после этого удалим первую строку с количеством грузов и общей грузоподъемностью.
Отсортируем данные по возрастанию. Сначала нужно взять грузы массой от 180 до 200 кг. Таких грузов 16
(диапазон А154:А169) общей массой 3018 кг. Тогда остается еще кг.
Теперь мы можем вывезти максимум 102 груза(считаем самые маленькие в диапазоне А1:А102). Первые 101 груз
составят 6776 кг, тогда на 102-ой груз останется кг. Груз такой массы есть в таблице, тогда, берем
его. Значит, грузовик наполнен по максимуму, удалось поместить все 10000 кг.
Тогда всего получается грузов общей массой 10000кг.
Решение Python:
# Открываем файл для чтения file = open("26.txt") # Считываем первую строку файла и извлекаем количество грузов (n) и грузоподъёмность (m) n, m = map(int, file.readline().split()) # Создаем пустой список для хранения масс грузов array = [] # Читаем оставшиеся строки файла и добавляем массы грузов в массив for line in file: array.append(int(line.strip())) # Преобразуем каждую строку в целое число и добавляем в массив # Сортируем массив по возрастанию массы грузов array = sorted(array) # Инициализируем переменные i = 0 # Индекс для прохода по массиву current_sum = 0 # Текущая масса выбранных грузов last_elem = 0 # Масса последнего добавленного груза ind_last = 0 # Индекс последнего добавленного груза в первой итерации count = 0 # Количество выбранных грузов # Первая часть: выбираем грузы весом от 180 до 200 кг while i < len(array) and array[i] <= 200: if array[i] >= 180 and current_sum + array[i] <= m: current_sum += array[i] # Добавляем массу груза к текущей сумме last_elem = array[i] # Обновляем массу последнего добавленного груза count += 1 # Увеличиваем счетчик выбранных грузов else: ind_last = i # Запоминаем индекс, если не удалось добавить груз i += 1 # Переходим к следующему грузу # Вторая часть: выбираем грузы с меньшей массой до индекса ind_last for j in range(ind_last): if current_sum + array[j] <= m: current_sum += array[j] # Добавляем массу груза к текущей сумме last_elem = array[j] # Обновляем массу последнего добавленного груза count += 1 # Увеличиваем счетчик выбранных грузов # Третья часть: выбираем грузы с большей массой, начиная с индекса i for j in range(i, len(array)): if current_sum + array[j] <= m: current_sum += array[j] # Добавляем массу груза к текущей сумме last_elem = array[j] # Обновляем массу последнего добавленного груза count += 1 # Увеличиваем счетчик выбранных грузов # Вычисляем оставшееся место в грузовике free_space = m - current_sum + last_elem # Четвертая часть: ищем максимальный элемент, который можно добавить без превышения свободного места for i in range(len(array) - 1, -1, -1): if array[i] <= free_space: # Проверяем, помещается ли груз в оставшееся место current_sum += array[i] - last_elem # Обновляем сумму, заменяя последний добавленный груз break # Выходим из цикла после добавления # Выводим результаты: количество выбранных грузов и их общую массу print(count, current_sum)
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!
Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение
Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты
Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей
Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!