Задание EGEINFBDC5D0: Сортировка, отбор и моделирование

ФИПИ · ЕГЭ · все форматы ответа · 2475 заданий

Открыть решение ↓ Ошибка или пожелание

Тип задачи: Сортировка, отбор и моделирование.

Учебные темы: Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве.

Впишите правильный ответ.

Скачать 26.txt

 

Рисунок из условия ФИПИ

 

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

 

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

 

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

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

 

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

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

Пример входного файла:

100 4

80

30

50

40

 

При таких исходных данных можно транспортировать за один раз максимум 2 контейнера. Возможные массы этих двух контейнеров 30 и 40, 30 и 50 или 40 и 50. Поэтому ответ для приведённого примера:

 

2

50

 

 

Ответ:

 

 

 



i
СВОЙСТВА ЗАДАНИЯ
КЭС:
3.10 Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности (суммы, произведения, среднего арифметического, минимального и максимального элементов, количества элементов, удовлетворяющих заданному условию). Линейный поиск заданного значения в массиве. Алгоритмы работы с элементами массива с однократным просмотром массива. Сортировка одномерного массива. Простые методы сортировки (метод пузырька, метод выбора, сортировка вставками). Сортировка слиянием. Быстрая сортировка массива (алгоритм QuickSort). Двоичный поиск в отсортированном массиве
Тип ответа:Краткий ответ
Номер: BDC5D0
НЕ РЕШЕНО Ответить

Решение задания EGEINFBDC5D0

Ответ: 1612 90

Решение.
Сначала нужно перевезти как можно больше контейнеров. Только среди загрузок с этим количеством выбираем наибольшую возможную массу самого тяжёлого контейнера.
Отсортируем массы по возрастанию и будем брать контейнеры начиная с самого лёгкого, пока следующий помещается. Пусть удалось взять k контейнеров. Для любого другого набора из k контейнеров его масса не меньше суммы k самых лёгких. Поэтому если первые k + 1 контейнеров уже превышают грузоподъёмность, никакой набор из k + 1 контейнеров не поместится.
Теперь максимизируем массу тяжелейшего контейнера, сохраняя количество k. Оставим первые k − 1 самых лёгких: их суммарная масса минимально возможная. Вместо последнего выбранного возьмём самый тяжёлый из остальных контейнеров, который помещается вместе с этой основой. Более тяжёлый контейнер не поместится даже с самой лёгкой основой, значит не поместится ни в каком допустимом наборе из k контейнеров.
Случай k = 0 обрабатываем отдельно: перевозимых контейнеров нет, оба выходных числа равны нулю. В исходном файле этот случай не возникает.
Программа на Python 3:

with open('26.txt') as f:
    capacity, n = map(int, f.readline().split())
    weights = sorted(int(f.readline()) for _ in range(n))

count = 0
total = 0
while count < n and total + weights[count] <= capacity:
    total += weights[count]
    count += 1

heaviest = 0
if count > 0:
    base = total - weights[count - 1]
    for weight in weights[count - 1:]:
        if base + weight <= capacity:
            heaviest = weight
print(count, heaviest)

Исходный файл содержит 9999 контейнеров, грузоподъёмность равна 99990. Получены следующие контрольные значения:

НаборСуммарная масса
1612 самых лёгких99932
1613 самых лёгких99997
1611 самых лёгких99867
1611 самых лёгких и контейнер массой 9099957

Поскольку 99932 ≤ 99990 < 99997, максимальное количество равно 1612. Для последнего контейнера остаётся 99990 − 99867 = 123 единицы грузоподъёмности. В файле максимальная масса контейнера равна 90, поэтому выбираем его; итоговая масса 99957 укладывается в ограничение.
Проверка. Независимый подсчёт количества контейнеров каждой массы и проверка каждого кандидата на самый тяжёлый дали тот же результат. Сортировка требует O(N log N) времени, дальнейшие проходы — O(N); память O(N).
Ответ: 1612 90.

Помочь улучшить сайт

Напишите пожелание к сайту или решению либо сообщите о найденной неточности в задании EGEINFBDC5D0.

Сообщение увидит только команда сайта: на странице оно не публикуется.

Комментарии к решению

Комментарии видны всем посетителям сайта.

Комментариев пока нет. Будьте первым.

Чтобы оставить комментарий, войдите или зарегистрируйтесь.