Вверх
Тренировка по линии

Линия заданий 26, ЕГЭ 2027 по информатике

Решайте задания по одному, проверяйте себя сразу и открывайте подсказки там, где нужно.

19219. Системный администратор создаёт архив пользовательских файлов. Все файлы исходного размера 99 единиц являются обязательными и сохраняются в первую очередь. После этого на оставшееся место нужно поместить максимально возможное количество остальных файлов. При одинаковом количестве дополнительно выбранных файлов требуется максимизировать размер одного из них.

Файл для выполнения задания

В первой строке находятся S — размер свободного места и N — количество файлов. В следующих N строках записаны размеры файлов.

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

Верный ответ: 191 31

Сначала сохраняются обязательные файлы.
В наборе имеется 7 файлов размера 99. Они занимают 7 · 99 = 693 единицы, поэтому после их сохранения остаётся 2587 − 693 = 1894 единицы. Исключать эти файлы ради большего количества маленьких нельзя: условие прямо требует сохранить их в первую очередь.

На оставшемся месте максимизируем количество.
Остальные файлы сортируем по возрастанию. Сумма 184 наименьших файлов равна 1883. Следующий файл имеет размер 20, и 1883 + 20 = 1903, что больше оставшегося объёма. Значит, дополнительно можно сохранить максимум 184 файла.

Ищем максимальный размер одного дополнительного файла.
183 наименьших файла занимают 1863 единицы, поэтому для последнего остаётся 31. В данных есть неприоритетный файл размера 31; файл большего размера уже не помещается. Общее количество равно 7 + 184 = 191.

Структура решения:

mandatory = [x for x in files if x == 99]
other = sorted(x for x in files if x != 99)
free = S - sum(mandatory)
Второе число относится именно к дополнительно выбранным файлам. Если учитывать обязательные файлы, оно всегда было бы равно 99 и не отражало бы второй этап оптимизации.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19219.

19192. Системный администратор создаёт архив пользовательских файлов. Для каждого сохранённого файла создаётся служебная запись размером 2 единицы, поэтому файл исходного размера x занимает на диске x + 2 единицы.

Определите максимальное число файлов, которое можно сохранить, и максимальный исходный размер одного файла, который может входить в архив при сохранении максимально возможного числа файлов.

Файл для выполнения задания

В первой строке записаны S — свободное место на диске и N — количество файлов. В следующих N строках находятся исходные размеры файлов.

Запишите два найденных числа без пробела.

Верный ответ: 19829

Каждый выбранный файл расходует на две единицы больше своего исходного размера. Поэтому при проверке вместимости используется величина x + 2, а не x.

Максимальное количество.
Сортируем файлы по возрастанию исходного размера: прибавление одинаковых двух единиц ко всем файлам не меняет их порядок. Сумма занимаемых размеров 198 самых маленьких файлов равна 2581. Следующий файл вместе со служебной записью занимает 25 единиц, и 2581 + 25 = 2606, что больше S = 2587. Следовательно, 199 файлов не помещаются.

Максимальный исходный размер при количестве 198.
197 файлов с наименьшими занимаемыми размерами требуют 2556 единиц. Для последнего файла остаётся 31 единица с учётом служебной записи, поэтому его исходный размер должен быть не больше 29. Файл размера 29 в данных есть и помещается.

Фрагмент решения:

a.sort()
s = 0
k = 0
while k < N and s + a[k] + 2 <= S:
    s += a[k] + 2
    k += 1

base = sum(x + 2 for x in a[:k - 1])
last = max(x for x in a[k - 1:] if base + x + 2 <= S)
После вычислений числа 198 и 29 соединяются без пробела только из-за формата ответа, указанного в условии.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19192.

19165. Робот складывает монеты в ящики. Задача робота — заполнить как можно большее количество ящиков монетами в количестве 100 штук. Роботу по конвейеру поступают корзины с монетами. В каждой корзине может быть от 1 до 99 монет. Известно, что робот может высыпать в ящик содержимое не более двух корзин. Корзина должна быть высыпана в ящик полностью. Необходимо определить, сколько ящиков можно заполнить монетами так, чтобы в каждом из них было ровно по 100 монет.

Входные данные представлены в файле следующим образом. В первой строке записано число N – количество корзин, в каждой из последующих N строк число K – количество монет в каждой корзине.

В качестве ответа дать одно число – количество ящиков, заполненных 100 монетами.

Верный ответ: 4729

В один ящик можно высыпать содержимое не более двух корзин, а сумма должна быть ровно 100. Поэтому корзина с x монетами может образовать пару только с корзиной, в которой 100 − x монет.

Почему используется минимум двух количеств.
Если корзин с x монетами имеется A, а корзин с 100 − x монетами — B, то можно собрать не более min(A, B) ящиков: каждая пара расходует по одной корзине каждого вида, повторно использовать корзину нельзя.

Пары достаточно рассматривать для x от 1 до 49. Если после пары 30 и 70 отдельно рассмотреть 70 и 30, те же корзины будут посчитаны второй раз. Особый случай — корзины по 50 монет: для одного ящика нужны две такие корзины, поэтому их вклад равен count[50] // 2.

Программа:

from collections import Counter

cnt = Counter(baskets)
boxes = 0
for x in range(1, 50):
    boxes += min(cnt[x], cnt[100 - x])
boxes += cnt[50] // 2
В файле 99 корзин по 50 монет, они дают 49 ящиков. Все остальные взаимодополняющие пары дают ещё 4680 ящиков. Остаточная непарная корзина каждого вида использоваться не может, потому что делить её содержимое запрещено.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19165.

19138. Системный администратор создаёт архив пользовательских файлов. Файлы исходного размера от 50 до 60 включительно считаются приоритетными и должны быть сохранены все. После их сохранения на оставшееся место требуется поместить как можно больше остальных файлов. При одинаковом максимальном количестве дополнительно выбранных файлов нужно сделать максимально большим размер одного из них.

Файл для выполнения задания

В первой строке записаны S — размер свободного места и N — количество файлов. В следующих N строках находятся размеры файлов.

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

Верный ответ: 1125 49

Приоритетные файлы нельзя смешивать с обычным жадным выбором.
Сначала отбираем все файлы размеров от 50 до 60 включительно. Таких файлов 41, их суммарный размер равен 2222. Они помещаются, поэтому для остальных файлов остаётся 13 820 − 2222 = 11 598 единиц.

Максимизируем число неприоритетных файлов.
Из дальнейшего рассмотрения исключаем размеры 50–60, затем сортируем остальные файлы по возрастанию. Сумма 1084 наименьших неприоритетных файлов равна 11 581. Следующий файл имеет размер 41, и 11 581 + 41 = 11 622, поэтому 1085 дополнительных файлов уже не помещаются.

Максимизируем размер одного дополнительного файла.
Оставим 1083 наименьших неприоритетных файла: они занимают 11 540 единиц. На последний остаётся 58. Но размеры 50–60 являются приоритетными и уже исключены из дополнительного набора, поэтому самый большой допустимый неприоритетный размер — 49. Всего сохраняется 41 + 1084 = 1125 файлов.

Ключевая структура решения:

priority = [x for x in files if 50 <= x <= 60]
other = [x for x in files if not (50 <= x <= 60)]
free = S - sum(priority)
other.sort()
Если сначала выбрать самые маленькие файлы из общего списка, часть обязательных файлов может не поместиться — это нарушит условие, даже если количество окажется больше.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19138.

19111. Системный администратор создаёт архив пользовательских файлов. Объём диска может быть меньше суммарного объёма всех файлов. По данным о размерах файлов определите максимальное число пользователей, чьи файлы можно сохранить, а затем максимальный размер одного файла, который может входить в архив при сохранении максимально возможного числа файлов.

Файл для выполнения задания

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

Запишите два найденных числа без пробела.

Верный ответ: 21525

Размеры сортируем по возрастанию, потому что именно самые маленькие файлы дают наибольшее возможное количество пользователей. Сумма 215 наименьших файлов равна ровно 2587 — всему свободному объёму диска. Следовательно, 215 файлов сохранить можно, а добавить 216-й уже невозможно.

Для второго числа оставляем 214 наименьших файлов. Их сумма равна 2562, поэтому на последний файл остаётся 2587 − 2562 = 25 единиц. В данных есть файл размера 25, а любой файл большего размера превысил бы вместимость.

Почему ответ записывается слитно.
По условию два числа нужно записать без пробела: сначала количество 215, затем размер 25. Это требование относится только к форме записи; в вычислениях числа остаются самостоятельными.

Алгоритм:

a.sort()
s = 0
k = 0
while k < N and s + a[k] <= S:
    s += a[k]
    k += 1

base = sum(a[:k - 1])
last = max(x for x in a[k - 1:] if base + x <= S)
Точное заполнение диска суммой 215 минимальных файлов дополнительно подтверждает найденное максимальное количество.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19111.

19084. Дед Мороз собирает подарки для детей. Объём мешка может быть меньше суммарного объёма всех коробок. По известным объёмам коробок определите максимальное число подарков, которое можно поместить в мешок, а также максимальный объём одной коробки, которая может находиться в мешке при выбранном максимальном количестве подарков.

Файл для выполнения задания

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

Запишите два числа через пробел: максимальное количество подарков и максимальный объём одной коробки при таком количестве.

Пример:
100 4
80
30
50
40
Для примера ответ: 2 50.

Верный ответ: 561 50

Сначала ищем максимальное количество.
Чтобы взять как можно больше подарков, коробки сортируют по возрастанию объёма. Если набор из самых маленьких коробок уже не помещается, никакой другой набор того же, большего количества поместиться не сможет: замена маленькой коробки на большую только увеличивает сумму.
Сумма 561 наименьшей коробки равна 7973. Следующая коробка имеет объём 29, и 7973 + 29 = 8002, что больше объёма мешка 8000. Поэтому 562 подарка взять невозможно.

Затем увеличиваем одну коробку, сохраняя количество.
Оставим 560 самых маленьких коробок. Они занимают 7944 единицы, поэтому на последнюю коробку остаётся 56. Среди коробок, которые ещё можно выбрать, максимальный объём, не превышающий 56, равен 50. Именно поэтому нельзя просто вывести объём 561-й коробки после сортировки: требуется найти наибольшую допустимую замену.

Схема программы:

boxes.sort()
s = 0
k = 0
while k < N and s + boxes[k] <= S:
    s += boxes[k]
    k += 1

base = sum(boxes[:k - 1])
large = max(x for x in boxes[k - 1:] if base + x <= S)
Первый цикл отвечает за число подарков, а поиск по оставшимся коробкам — за максимально возможный объём одной из них.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19084.

19057. Системный администратор создаёт архив пользовательских файлов. Перед сохранением файлы размером не более 50 единиц остаются без изменения, а файлы размером больше 50 единиц сжимаются до 60% исходного размера с округлением вверх. Например, файл размером 71 после сжатия занимает 43 единицы.

По данным файла определите максимальное количество файлов, которое можно разместить на диске, а затем максимальный исходный размер одного файла, который может входить в архив при сохранении максимально возможного количества файлов.

Файл для выполнения задания

В первой строке находятся S — размер свободного места и N — количество файлов. В следующих N строках записаны исходные размеры файлов.

Запишите два числа через пробел.

Верный ответ: 1148 96

Сравнивать нужно размеры после сжатия.
Файл x ≤ 50 занимает x единиц, а для x > 50 его размер равен ⌈0,6x⌉. Поэтому сортировка только по исходным размерам неверна: например, исходный файл 60 после сжатия занимает 36 единиц и может оказаться выгоднее несжатого файла 40.

Удобно для каждого файла хранить пару «занимаемый размер, исходный размер» и сортировать по первому компоненту. Сумма 1148 наименьших занимаемых размеров равна 13 782. Следующий размер равен 39, и 13 782 + 39 = 13 821, что больше S = 13 820. Следовательно, 1149 файлов не помещаются.

Для второго критерия оставляем 1147 файлов с минимальными занимаемыми размерами. Они занимают 13 743 единицы, поэтому для ещё одного файла остаётся 77 единиц. Самый большой исходный файл в наборе имеет размер 96; после сжатия он занимает ⌈96 · 0,6⌉ = 58 единиц и помещается. Более крупного файла во входных данных нет.

Вычисление сжатого размера без вещественных чисел:

def packed(x):
    if x <= 50:
        return x
    return (3 * x + 4) // 5   # округление 3*x/5 вверх

items = sorted((packed(x), x) for x in files)
При поиске максимального количества складывается первый элемент пары, а при выборе последнего файла сравнивается второй — исходный размер.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19057.

19030. Администратор раскладывает N архивов по K дискам объёмом V каждый. Архивы обрабатываются по убыванию размера. Для очередного архива проверка начинается с текущего диска. Если архив не помещается, проверяется следующий диск и далее по кругу. После успешной записи следующий архив начинают проверять с диска, следующего за использованным. Если архив не помещается ни на один диск, он откладывается, а свободное место на дисках не изменяется.

После обработки всех архивов определите:
1) суммарное свободное место на всех дисках;
2) номер диска с наибольшим свободным остатком. Диски нумеруются от 1 до K; если максимальный остаток одинаков на нескольких дисках, укажите наименьший номер.

Файл для выполнения задания

В первой строке записаны V, K и N. В следующих N строках находятся размеры архивов.

Запишите два числа через пробел.

Пример:
20 3 10
17
15
13
12
11
7
6
4
3
2
После выполнения алгоритма на дисках остаётся 0, 1 и 0 единиц, поэтому для примера ответ: 1 2.

Верный ответ: 230 2

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

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

Моделирование:

files.sort(reverse=True)
free = [V] * K
start = 0

for x in files:
    for shift in range(K):
        d = (start + shift) % K
        if x <= free[d]:
            free[d] -= x
            start = (d + 1) % K
            break

free_sum = sum(free)
max_free = max(free)
disk = free.index(max_free) + 1
Метод index возвращает первое вхождение максимума, поэтому при равенстве остатков автоматически выбирается диск с наименьшим номером.

После обработки файла остатки на дисках равны 0, 82, 24, 0, 0, 77, 44 и 3. Их сумма равна 230, а наибольший остаток 82 находится на диске № 2. Отложенные архивы в сумму свободного места не входят: они ничего не занимают на дисках.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19030.

19003. Для перевозки партии грузов различной массы выделен грузовик, но его грузоподъёмность ограничена, поэтому перевезти сразу все грузы не удастся. Грузы массой от 310 до 320 кг грузят в первую очередь, выбирая грузы по убыванию массы, начиная с самого тяжёлого. На оставшееся после этого место стараются взять как можно большее количество грузов. Если это можно сделать несколькими способами, выбирают тот способ, при котором самый большой из выбранных грузов имеет наибольшую массу. Если и при этом условии возможно несколько вариантов, выбирается тот, при котором наибольшую массу имеет второй по величине груз, и т.д. Известны количество грузов, масса каждого из них и грузоподъёмность грузовика. Необходимо определить количество и общую массу грузов, которые будут вывезены при погрузке по вышеописанным правилам.

Файл для выполнения задания

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

Пример организации исходных данных во входном файле:
6            720
100
315
120
160
140
300
В данном случае сначала нужно взять груз массой 315 кг. Остается 405 кг. После этого можно вывезти ещё максимум 3 груза. Это можно сделать тремя способами: 100 + 120 + 140, 100 + 140 + 160, 100 + 120 + 160. Выбираем способ, при котором вывозится груз наибольшей возможной массы. Таких способов два: 100 + 120 + 160, 100 + 140 + 160. Из этих способов выбираем тот, при котором больше масса второго по величине груза, то есть 100 + 140 + 160. Всего получается 4 груза общей массой 715 кг. Ответ: 4 715.

Верный ответ: 543 130311

Сначала выполняется обязательный приоритет.
Нельзя сразу сортировать все грузы по возрастанию: грузы массой от 310 до 320 кг должны быть загружены раньше остальных. В файле таких грузов 351, их общая масса равна 110 566 кг. Все они помещаются, поэтому после приоритетной погрузки остаётся 130 311 − 110 566 = 19 745 кг.

Затем максимизируется количество остальных грузов.
Оставшиеся массы сортируем по возрастанию. Сумма 192 самых лёгких грузов равна 19 646 кг, а добавление следующего груза массой 105 кг дало бы 19 751 кг, что уже больше остатка. Следовательно, дополнительно можно взять не более 192 грузов.

Учитываем правило выбора при одинаковом количестве.
Чтобы сделать набор из 192 грузов лексикографически самым тяжёлым, оставляем 191 самый лёгкий груз. Их сумма равна 19 541 кг, поэтому для последнего груза остаётся 204 кг. В данных есть груз массой 204 кг; более тяжёлый уже не помещается. Получается 351 + 192 = 543 груза, а суммарная масса равна полной грузоподъёмности 130 311 кг.

Фрагмент алгоритма для второй части:

other.sort()
s = 0
k = 0
while k < len(other) and s + other[k] <= free:
    s += other[k]
    k += 1

base = sum(other[:k - 1])
last = max(x for x in other[k - 1:] if base + x <= free)
Первый этап нельзя смешивать со вторым: иначе лёгкие грузы вытеснят обязательные грузы диапазона 310–320 кг, и будет нарушено условие задачи.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 19003.

18976. Системный администратор раз в неделю создаёт архив пользовательских файлов. Однако объём диска, куда он помещает архив, может быть меньше, чем суммарный объём архивируемых файлов.

Известно, какой объём занимает файл каждого пользователя. Системный администратор старается сохранить файлы как можно большего размера. При этом используя выделенную память максимально эффективно – сохраняя файлы меньшего размера, если файлы большего не могут быть сохранены.

Файл для выполнения задания

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

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

Запишите в ответе два числа: сначала число сохраненных файлов, затем размер наименьшего сохраненного файла.

Пример входного файла:
100      4
70
10
25
3
При таких исходных данных можно сохранить три файла – 70, 25, 3. Поэтому ответ должен содержать два числа – 3 и 3.

Верный ответ: 837 61

Администратор не стремится получить наибольшее количество файлов любой ценой. По условию он сначала пытается сохранить самые большие файлы, поэтому размеры сортируются по убыванию.

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

Программа:

files.sort(reverse=True)
free = S
count = 0
smallest = None

for x in files:
    if x <= free:
        free -= x
        count += 1
        smallest = x
Так как файлы просматриваются от больших к маленьким, переменная smallest после каждого успешного сохранения содержит размер наименьшего из уже выбранных файлов. В данном файле после сохранения 836 файлов остаётся 61 единица; файл размера 61 помещается и полностью заполняет диск. В итоге выбрано 837 файлов, а меньшие файлы уже не могут быть добавлены из-за нулевого остатка.

P.S. Нашли ошибку в задании? Пожалуйста, сообщите о вашей находке ;)
При обращении указывайте id этого вопроса - 18976.

Для вас приятно генерировать тесты, создавайте их почаще