Задание 27 ЕГЭ по информатике · 2931D9

Программа и описание алгоритмаВысокаяКЭС 3.2КЭС 3.3
Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, разность которых чётна и, по крайней мере, один из элементов делится на p=21. Порядок элементов в паре неважен. Среди всех таких пар нужно найти и вывести пару с максимальной суммой элементов. Если одинаковую максимальную сумму имеет несколько пар, можно вывести любую из них. Если подходящих пар в последовательности нет, нужно вывести два нуля.
В первой строке входных данных задаётся количество чисел N (2≤N≤10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Напишите эффективную по времени и памяти программу для решения этой задачи. Программа должна работать за время O(N) и использовать объём памяти, не зависящий от N и не превышающий 1 Кбайт.
Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.

Развёрнутый ответ: проверяется по критериям ФИПИ.

Подсказки (3)
  1. Разность двух чисел чётна тогда и только тогда, когда числа имеют одинаковую чётность. Какие группы чисел достаточно рассматривать отдельно?
  2. Для каждой чётности храните два наибольших числа среди всех прочитанных и два наибольших числа, кратных 21. Этого достаточно для формирования любой оптимальной пары.
  3. После чтения очередного числа обновляйте четыре набора кандидатов: два лучших всех чисел и два лучших чисел, кратных 21, для каждой чётности. Переберите пары среди сохранённых кандидатов и выберите пару с максимальной суммой, в которой хотя бы один элемент кратен 21.
Решение
1. Разность элементов пары должна быть чётной, поэтому оба элемента должны иметь одинаковую чётность. Обрабатываем отдельно чётные и нечётные числа.
a mod 2=b mod 2

2. Для каждой чётности сохраняем два наибольших числа среди всех чисел и два наибольших числа, кратных 21. Два элемента нужны потому, что элементы пары должны быть различными элементами последовательности, даже если их значения совпадают.

3. Любая оптимальная пара состоит из сохранённых кандидатов: если элемент не входит в два наибольших числа своей чётности или в два наибольших числа, кратных 21, его можно заменить на более крупный допустимый элемент, не уменьшая сумму.

4. Перебираем все пары сохранённых кандидатов одной чётности. Оставляем только пары, в которых хотя бы один элемент делится на 21, и выбираем пару с наибольшей суммой.

5. Алгоритм выполняет постоянное число операций для каждого из N чисел, поэтому работает за O(N) и использует O(1) памяти.

6. Пример программы на Python 3:
from sys import stdin

n = int(stdin.readline())
all_best = [[], []]
div_best = [[], []]

for _ in range(n):
x = int(stdin.readline())
parity = x % 2

all_best[parity].append(x)
all_best[parity].sort(reverse=True)
del all_best[parity][2:]

if x % 21 == 0:
div_best[parity].append(x)
div_best[parity].sort(reverse=True)
del div_best[parity][2:]

answer = None

for parity in (0, 1):
candidates = []
for x in all_best[parity] + div_best[parity]:
if x not in candidates:
candidates.append(x)

for i in range(len(candidates)):
for j in range(i + 1, len(candidates)):
a = candidates[i]
b = candidates[j]
if (a % 21 == 0 or b % 21 == 0):
pair = (a, b)
if answer is None or sum(pair) > sum(answer):
answer = pair

if answer is None:
print(0, 0)
else:
print(answer[0], answer[1])
Частые ошибки
  • Проверять только значения чисел, а не количество их вхождений: пара из двух одинаковых значений допустима только при наличии двух соответствующих элементов.
  • Рассматривать только пары, в которых оба числа делятся на $21$, хотя по условию достаточно делимости хотя бы одного элемента.
  • Не разделять числа по чётности.
  • Сохранять всю последовательность, нарушая ограничение по памяти.
  • Использовать двойной перебор всех пар, что даёт сложность $O(N^2)$.

Источник: Открытый банк ФИПИ

Похожие задания

27Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности…Программа и описание алгоритма · 0B12A627На вход программы поступает последовательность из n целых положительных чисел. Рассматриваются все пары…Программа и описание алгоритма · 195BE627Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4…Программа и описание алгоритма · 233FD127Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности…Программа и описание алгоритма · 26775227Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 3…Программа и описание алгоритма · 29FE8627Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4…Программа и описание алгоритма · 2C4C0127Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности…Программа и описание алгоритма · 335BFF27Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4…Программа и описание алгоритма · 37B022

Нужен репетитор по информатике?

Посмотрите репетиторов, которые ведут занятия в Precettore, или оставьте заявку — подберём сами.

Репетиторы по информатике

Подбор репетитора

Напишите, что нужно, — команда Precettore подберёт репетитора и свяжется с вами.

Готовьтесь к ЕГЭ по информатике в Precettore

Варианты с автопроверкой, домашние задания от репетитора, онлайн-доска и разбор ошибок — в одном кабинете. Регистрация бесплатная.