РУҚА
27

Максимальная сумма без делимости

ЕГЭ · Информатика · Задание 27 · Динамическое программирование
ВысокаяФИПИ549B82Короткий ответ≈ 15 минут

Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на $k = 109$ и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно.

Даны два входных файла — файл A и файл B. Каждый файл содержит в первой строке количество троек $N$ ($1 \leq N \leq 1\,000\,000$). Каждая из следующих $N$ строк содержит три натуральных числа, не превышающих $12\,000$.

Для приведённого в условии примера, если $k = 5$, искомая сумма равна 44. В ответе укажите значение искомой суммы для файла A, затем для файла B. Для обработки файла B нельзя использовать перебор всех возможных вариантов.

Вложенные файлы с исходными данными в предоставленном наборе отсутствуют, поэтому числовые значения ответов для файлов A и B определить невозможно.

Условие как в банке ФИПИ — открыть и сверить
Впишите правильный ответ.

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

Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на k = 109 и при этом была максимально возможной. Гарантируется, что искомую сумму получить можно.

Программа должна напечатать одно число – максимально возможную сумму, соответствующую условиям задачи.

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

Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество троек N (1 ≤ N ≤ 1 000 000). Каждая из следующих N строк содержит три натуральных числа, не превышающих 12 000.

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

6

1 3 7

5 12 6

6 9 11

5 4 8

3 5 4

1 1 1

Для указанных входных данных, в случае, если k = 5, значением искомой суммы является число 44.

В ответе укажите два числа: сначала значение искомой суммы для файла А, затем для файла B.

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



Ваш ответ

Формат: число или слово без единиц измерения; дробную часть отделяйте запятой.

!
3 уровня: от лёгкого толчка до почти готового решения. Следующий открывается, когда прочитан предыдущий, — чтобы не перепрыгнуть сразу к ответу.
1Мягкая — с чего смотретьуровень 1 из 3

Как хранить максимальную сумму для каждого возможного остатка по модулю $109$ после обработки очередного числа троек?

2Наводящая — какие числа считатьуровень 2 из 3

Используйте динамическое программирование: для каждого остатка храните максимальную достижимую сумму. При добавлении числа $x$ новый остаток равен $(r+x) \bmod 109$.

3Прямая — фактически решениеуровень 3 из 3

Инициализируйте $dp[0] = 0$, остальные значения — минус бесконечностью. Для каждой тройки постройте новый массив: $new[(r+x) \bmod 109] = \max(new[(r+x) \bmod 109], dp[r]+x)$. После обработки всех троек найдите максимум среди $dp[r]$ при $r \ne 0$.

Всё равно не складывается?Полное решение с обоснованием каждого шага — на отдельной странице.
Открыть решение

Задание 27 ЕГЭ, информатика

Задача из темы «Динамическое программирование»: в ней 72 задачи с ответом и разбором по шагам. В 27-м номере бланка — 49 задач.

Ответ можно проверить здесь же, а если не выходит — открыть подсказку или разбор. Регистрация не нужна.