Максимальная сумма пары
На вход программы поступает последовательность из $n$ целых положительных чисел. Рассматриваются все пары элементов последовательности $a_i$ и $a_j$, такие что $i < j$ и $a_i > a_j$. Среди пар, удовлетворяющих этому условию, необходимо найти и напечатать пару с максимальной суммой элементов, которая делится на $m = 111$. Если среди найденных пар максимальную сумму имеют несколько, то можно напечатать любую из них.
В первой строке входных данных задаётся количество чисел $n$ ($2 \le n \le 12\,000$). В каждой из последующих $n$ строк записано одно целое положительное число, не превышающее $10\,000$.
В качестве результата программа должна напечатать элементы искомой пары. Гарантируется, что хотя бы одна такая пара в последовательности есть.
Требуется написать эффективную по времени и памяти программу. Эффективность по времени означает, что при одновременном увеличении $n$ и параметра $m$ в $k$ раз время работы увеличивается не более чем в $k$ раз. Память для хранения всех переменных не должна превышать 4 килобайт и не должна увеличиваться с ростом $n$.
Перед текстом программы необходимо кратко описать алгоритм решения, указать использованный язык программирования и его версию.
Условие как в банке ФИПИ — открыть и сверить
| На вход программы поступает последовательность из n целых положительных чисел. Рассматриваются все пары элементов последовательности ai и aj, такие что i < j и ai > aj (первый элемент пары больше второго, i и j порядковые номера чисел в последовательности входных данных). Среди пар, удовлетворяющих этому условию, необходимо найти и напечатать пару с максимальной суммой элементов, которая делится на m = 111. Если среди найденных пар максимальную сумму имеют несколько, то можно напечатать любую из них. Описание входных и выходных данных В первой строке входных данных задаётся количество чисел n (2 ≤ n ≤ 12 000). В каждой из последующих n строк записано одно целое положительное число, не превышающее 10 000. В качестве результата программа должна напечатать элементы искомой пары. Если таких пар несколько, можно вывести любую из них. Гарантируется, что хотя бы одна такая пара в последовательности есть. Пример входных данных: 6 60 122 61 100 273 50 Пример выходных данных для приведённого выше примера входных данных: 122 100 Пояснение. Из шести заданных чисел можно составить 3 пары, сумма элементов которых делится на m=111: 60+273, 122+100, 61+50. Во второй Требуется написать эффективную по времени и памяти программу для решения описанной задачи. Программа считается эффективной по времени, если при одновременном увеличении количества элементов последовательности n и параметра m Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и памяти, 4 балла. Максимальная оценка за правильную программу, возможно, неэффективную по памяти или время выполнения которой существенно зависит от Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, 2 балла. Вы можете сдать одну программу или две программы решения задачи (например, одна из программ может быть менее эффективна). Если Вы сдадите две программы, то каждая из них будет оцениваться независимо от другой, итоговой станет боьшая из двух оценок. Перед текстом программы обязательно кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию. | ||
| |
Это задание с развёрнутым решением: ответом считается запись хода решения, а не строка. Напишите решение на бумаге и сравните с разбором — там каждый шаг с обоснованием.
Открыть разбор1Мягкая — с чего смотретьуровень 1 из 3
Как хранить информацию о предыдущих элементах, чтобы для каждого нового числа быстро находить подходящее значение с максимальной суммой?
2Наводящая — какие числа считатьуровень 2 из 3
Для суммы, кратной $111$, остатки двух чисел должны дополнять друг друга до $0$ по модулю $111$. Для каждого остатка храните максимальное предыдущее число, которое больше текущего.
3Прямая — фактически решениеуровень 3 из 3
Обрабатывайте числа слева направо. Перед обработкой очередного $x$ найдите среди сохранённых остатков максимальное значение с остатком $(-x) \bmod 111$ и проверьте условие первого элемента пары: это значение должно быть больше $x$. После этого обновите максимум для остатка предыдущего числа.