Задание 27 ЕГЭ по информатике · 267752
Программа и описание алгоритмаВысокаяКЭС 3.2КЭС 3.3
Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, удовлетворяющие следующим условиям: числа в паре имеют различные остатки от деления на d=160, и по крайней мере одно из чисел пары делится на p=7. Порядок элементов в паре неважен. Среди всех таких пар нужно найти и вывести пару с максимальной суммой элементов. Если одинаковую максимальную сумму имеет несколько пар, можно вывести любую из них. Если подходящих пар в последовательности нет, нужно вывести два нуля.
В первой строке входных данных задаётся количество чисел N (2≤N≤10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Напишите эффективную по времени и памяти программу для решения этой задачи. Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз, а при увеличении параметра d в k раз время работы программы не увеличивается. Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 1 Кбайт и не увеличивается с ростом N и d.
Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.
В первой строке входных данных задаётся количество чисел N (2≤N≤10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Напишите эффективную по времени и памяти программу для решения этой задачи. Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз, а при увеличении параметра d в k раз время работы программы не увеличивается. Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 1 Кбайт и не увеличивается с ростом N и d.
Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.
Развёрнутый ответ: проверяется по критериям ФИПИ.
Подсказки (3)
- Нужно обрабатывать числа по одному. Для текущего числа достаточно знать лучший подходящий элемент среди уже просмотренных чисел с другим остатком.
- Для запроса максимума с остатком, отличным от текущего, храните два самых больших значения с различными остатками. Отдельно поддерживайте такую пару для чисел, делящихся на 7.
- Если текущее число делится на 7, его можно объединить с максимальным ранее встреченным числом с другим остатком. Иначе его можно объединить только с максимальным ранее встреченным числом, делящимся на 7, с другим остатком. После проверки добавьте текущее число в структуры максимумов.
Решение
1. Обрабатываем числа слева направо. Для каждого уже обработанного числа достаточно хранить несколько лучших кандидатов: два максимальных числа с различными остатками и два максимальных числа, делящихся на 7, также с различными остатками. Если два максимальных значения имеют одинаковый остаток, сохраняем только большее из них. 2. Пусть текущее число равно x, а его остаток по модулю 160 равен r. Если x делится на 7, то второй элемент пары может быть любым ранее обработанным числом с остатком, не равным r. Если x не делится на 7, второй элемент должен делиться на 7 и иметь остаток, не равный r. x mod 7=0⇒y mod 160≠r;x mod 7≠0⇒y mod 7=0, y mod 160≠r 3. Из двух сохранённых максимумов выбираем первый, если его остаток отличается от r, иначе второй. Проверяем полученную сумму и при необходимости обновляем лучшую пару. 4. После проверки текущего числа обновляем общий набор двух максимумов и, если число делится на 7, набор двух максимумов среди чисел, делящихся на 7. В каждой структуре хранится постоянное число элементов, поэтому память не зависит от N и d. 5. Каждое число обрабатывается за постоянное число операций. Поэтому время работы имеет сложность O(N), а дополнительная память — O(1). 6. Пример программы на Python 3: 7. ```python import sys def add_best(best, value, residue): """Добавить значение в список двух максимумов с различными остатками. """ for i, item in enumerate(best): if item[1] == residue: if value > item[0]: best[i] = (value, residue) break else: if value > best[0][0]: best[1] = best[0] best[0] = (value, residue) elif value > best[1][0]: best[1] = (value, residue) best.sort(reverse=True) def get_best_different(best, residue): for value, saved_residue in best: if value != 0 and saved_residue != residue: return value return 0 n = int(sys.stdin.readline()) best_all = [(0, -1), (0, -1)] best_div7 = [(0, -1), (0, -1)] answer_sum = -1 answer_pair = (0, 0) for _ in range(n): x = int(sys.stdin.readline()) residue = x % 160 if x % 7 == 0: y = get_best_different(best_all, residue) else: y = get_best_different(best_div7, residue) if y != 0 and x + y > answer_sum: answer_sum = x + y answer_pair = (x, y) add_best(best_all, x, residue) if x % 7 == 0: add_best(best_div7, x, residue) print(answer_pair[0], answer_pair[1]) ```
Частые ошибки
- Хранение всех чисел последовательности, что нарушает требование по памяти.
- Хранение массива размера $d$, из-за чего память зависит от параметра $d$.
- Проверка только того, что одно число делится на $7$, без проверки различных остатков по модулю $160$.
- Добавление текущего числа в структуру до проверки пары с ним: в этом случае число может быть ошибочно спарено само с собой.
- Хранение только одного максимального значения без второго кандидата с другим остатком.
Источник: Открытый банк ФИПИ
Похожие задания
27Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности…Программа и описание алгоритма · 04D7CD27Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности…Программа и описание алгоритма · 0B12A627На вход программы поступает последовательность из n целых положительных чисел. Рассматриваются все пары…Программа и описание алгоритма · 195BE627Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4…Программа и описание алгоритма · 233FD127Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности…Программа и описание алгоритма · 2931D927Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 3…Программа и описание алгоритма · 29FE8627Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4…Программа и описание алгоритма · 2C4C0127Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности…Программа и описание алгоритма · 335BFF
Нужен репетитор по информатике?
Посмотрите репетиторов, которые ведут занятия в Precettore, или оставьте заявку — подберём сами.
Готовьтесь к ЕГЭ по информатике в Precettore
Варианты с автопроверкой, домашние задания от репетитора, онлайн-доска и разбор ошибок — в одном кабинете. Регистрация бесплатная.