ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий
Тип задачи: Сортировка, отбор и моделирование.
| КЭС: | 3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве |
| Тип ответа: | Краткий ответ |
Ответ: 791 197491
Решение.
Сохраним приложенный текстовый файл под именем data.txt. Первая строка задаёт параметры задачи; её нельзя считать обычной записью данных. В программе нумерация элементов списка начинается с нуля, а номера из условия сохраняются без сдвига.
Заголовок задаёт N = 853 грузов и M = 796 контейнеров. Сначала читаем N масс, затем M грузоподъёмностей. Эти количества различны, и один контейнер вмещает только один груз.
Сортируем грузы и контейнеры по убыванию. Если самый тяжёлый оставшийся груз превышает наибольшую оставшуюся грузоподъёмность, он не поместится никуда: пропускаем груз. Иначе помещаем его в самый вместительный контейнер и переходим к следующему контейнеру.
Такой шаг сохраняет максимально возможное количество пар. Если в оптимальном распределении тяжёлый груз и самый вместительный контейнер заняты другими партнёрами, их можно переставить: более лёгкий груз поместится в контейнер, выдерживавший тяжёлый. Если один из них не использован, достаточно одной замены. Если оба свободны, добавление пары улучшило бы якобы оптимальное распределение.
Следовательно, жадное распределение максимально по количеству. Оно включает самый тяжёлый груз, который вообще помещается в наибольший контейнер, и тем самым оптимизирует второй критерий. Время O(N log N + M log M), память O(N + M).
Полная программа на Python:
with open("data.txt", encoding="utf-8-sig") as f:
n, m = map(int, f.readline().split())
weights = sorted((int(f.readline()) for _ in range(n)), reverse=True)
capacities = sorted((int(f.readline()) for _ in range(m)), reverse=True)
count = 0
heaviest = 0
for weight in weights:
if count < m and weight <= capacities[count]:
heaviest = max(heaviest, weight)
count += 1
print(count, heaviest)Проверка результата.
Упаковано 791 грузов. Первые три назначения (номера грузов и контейнеров считаются отдельно с единицы):
| Груз | Масса | Контейнер | Грузоподъёмность |
|---|---|---|---|
| 817 | 197491 | 172 | 197604 |
| 483 | 197485 | 161 | 197595 |
| 732 | 197326 | 217 | 197578 |
В каждой из 791 пар масса не превышает грузоподъёмности, каждый номер используется один раз. Максимальная масса выбранного груза 197491.
Ответ: 791 197491.
Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFD8A5BB.
Сообщение увидит только команда сайта: на странице оно не публикуется.
Комментарии к решению
Комментарии видны всем посетителям сайта.
Комментариев пока нет. Будьте первым.
Чтобы оставить комментарий, войдите или зарегистрируйтесь.