Задание 17 ЕГЭ по информатике: обработка числовой последовательности
Задание 17 ЕГЭ по информатике (КЕГЭ) проверяет умение составить алгоритм обработки числовой последовательности и записать его в виде простой программы из 10–15 строк — так формулирует его ФИПИ. Это задание повышенного уровня, за него дают 1 первичный балл, к заданию прилагается файл `*.txt` с последовательностью целых чисел, а на экзамене обязательно нужна среда программирования — C#, C++, Pascal, Java или Python. Ответ здесь особый: два числа в двух ячейках таблицы, обычно «количество найденных пар» и «максимальная или минимальная из сумм (произведений) элементов таких пар». Частичного зачёта на этом задании нет: либо оба числа верны, либо 0 баллов — в отличие от задания 26, где за одно верное число из двух можно получить половину баллов. В статье — рабочие шаблоны на Python: чтение файла, один проход с накоплением счётчика и текущего максимума (минимума), предварительный проход для величин вида «максимальный элемент, оканчивающийся на 3», и разбор двух разных определений «пары» — идущих подряд элементов и любых двух элементов последовательности, — от которых чаще всего зависит, наберёте вы балл или нет. Дальше — три разобранных реальных задания из открытого банка ФИПИ с ответами, проверенными программой, и типичные ошибки. Потренироваться можно на реальных заданиях 17 ЕГЭ по информатике онлайн — с мгновенной проверкой ответа.
Что проверяет задание 17 ЕГЭ по информатике
Задание 17 стоит в разделе кодификатора «Алгоритмы и программирование», элемент содержания 3.10 («Массивы и последовательности чисел. Вычисление обобщённых характеристик элементов массива или числовой последовательности […]»), проверяемое требование — 2.12. По формулировке ФИПИ задание проверяет умение «составить алгоритм обработки числовой последовательности и записать его в виде простой программы (10–15 строк)». Это одно из заданий экзамена, где нужно писать и запускать реальную программу: без файла с сотнями или тысячами чисел задачу нельзя решить вручную за отведённое время.
Проверяемые умения (КЭС 3.10, требование 2.12):
- читать последовательность целых чисел из текстового файла построчно и переводить строки в числа;
- правильно понимать, что такое «пара» (или «тройка») элементов последовательности в конкретном условии — это задаёт сам текст задания, а не общее правило;
- организовать один проход по последовательности с накоплением счётчика и текущего экстремума (максимума или минимума);
- при необходимости выполнить предварительный проход, чтобы сначала найти вспомогательную величину (например, максимальный элемент, кратный 3 или оканчивающийся на определённую цифру), а затем использовать её как порог в основном проходе;
- корректно работать с последней цифрой и остатком от деления для отрицательных чисел;
- записать оба найденных числа в ответ в порядке, заданном условием.
Проекты КИМ-2027 ФИПИ публикует в конце августа 2026 года, но структура и содержание работы не менялись с 2025 года, поэтому все цифры ниже приведены по актуальной спецификации ФИПИ 2026 года.
| Параметр | Значение |
|---|---|
| Максимальный балл | 1 первичный. Частичного зачёта нет: оба числа ответа должны совпасть с эталоном, иначе — 0 баллов |
| Уровень сложности | Повышенный (П) |
| Форма ответа | Краткая: два целых числа в двух ячейках таблицы ответов — обычно количество найденных пар и максимальная (минимальная) из сумм или произведений их элементов, в порядке, указанном в условии |
| Раздел кодификатора | 3. Алгоритмы и программирование; КЭС 3.10; требование 2.12 |
| Файл | Прилагается: текстовый файл `*.txt` с последовательностью целых чисел, обычно по одному числу в строке |
| Специализированное ПО | Требуется среда программирования (C#, C++, Pascal, Java или Python) |
| Рекомендуемое время | 14 минут (по обобщённому плану ФИПИ) — больше, чем на любое другое задание с 1 по 18 |
| Связанные задания | Задание 26 (тот же КЭС 3.10, но с сортировкой, файл и частичный зачёт есть, высокий уровень, 2 балла), задание 24 (обработка символьной, а не числовой информации, тоже файл `*.txt`), задание 18 (та же форма ответа «два числа в двух ячейках», но электронные таблицы, а не программирование) |
Частичного зачёта на задании 17 нет. Это правило часто путают с заданием 26: там за одно верное число из двух можно получить половину полагающихся баллов. На заданиях 1–25, включая 17, действует только правило «полностью совпадает с эталоном или 0 баллов». Если верно только одно из двух чисел ответа — балл не засчитывается вообще.
Пишите и проверяйте программы на реальных данных
Задания ЕГЭ по информатике из открытого банка ФИПИ с прикреплёнными файлами и мгновенной проверкой ответа — на Repet.ai.
Как выглядит формулировка задания 17
Чаще всего условие начинается одинаково: «В файле содержится последовательность целых чисел». Дальше идёт диапазон значений (обычно от −10 000 до 10 000), определение «пары» (или «тройки») и свойство, которое нужно проверить. Вот формулировки из реальных заданий открытого банка ФИПИ:
«Определите и запишите в ответе сначала количество пар элементов последовательности, в которых хотя бы одно число делится на 3, а сумма элементов пары не более максимального элемента последовательности, кратного 3. […] В данной задаче под парой подразумевается два идущих подряд элемента последовательности.»
«Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются на одну и ту же нечётную цифру, затем максимальное из произведений модулей элементов таких пар.»
«Рассматривается множество целых чисел, принадлежащих числовому отрезку […], которые делятся на 3 и не делятся на 7, 17, 19, 27. Найдите количество таких чисел и максимальное из них.»
Третий пример показывает, что задание 17 не всегда работает с файлом-последовательностью в узком смысле: изредка встречается вариант «найдите числа в диапазоне с такими-то свойствами» без прикреплённого файла, где данные — сам диапазон. Но в подавляющем большинстве заданий банка ФИПИ файл `*.txt` прилагается, и именно этот вариант разбирается в статье дальше.
Ответ записывается в две ячейки таблицы ответов: в первую — количество найденных пар (или троек, если условие оперирует тройками), во вторую — искомый экстремум (максимум или минимум суммы, произведения, разности — что именно, всегда сказано в условии). Порядок ячеек задаёт формулировка «запишите в ответе сначала… затем…» — перепутать местами нельзя, это те же два числа, но не в том порядке, и весь ответ считается неверным. Оба числа должны совпасть с эталоном: частичного зачёта здесь нет.
Как решать задание 17: теория и рабочие шаблоны
Как прочитать файл с последовательностью на Python
Файл `*.txt` в задании 17 обычно содержит по одному целому числу в строке. Самый надёжный шаблон чтения — через open и readlines, с преобразованием строк в числа функцией map:
with open("17.txt") as f:
a = list(map(int, f.readlines()))
print(len(a))
print(a[0], a[-1])readlines сам убирает необходимость городить цикл руками, а int() корректно съедает символ перевода строки на конце каждой прочитанной строки — его не нужно вырезать отдельно. Если в конце файла есть пустая строка, замените чтение на вариант с фильтром:
with open("17.txt") as f:
a = [int(s) for s in f if s.strip()]Сразу после чтения полезно напечатать len(a) и несколько первых и последних значений — это быстрая проверка, что файл прочитан целиком и без перекоса на одну строку.
Один проход: счётчик плюс текущий экстремум
Почти все варианты задания 17 сводятся к одному и тому же шаблону: пройти по последовательности один раз, для каждой пары проверить условие и, если оно выполнено, увеличить счётчик и обновить текущий максимум (или минимум):
count = 0
best = None
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]
if условие(x, y):
count += 1
value = функция_от(x, y)
if best is None or value > best:
best = value
print(count, best)Ключевая деталь — инициализация best = None, а не best = 0. Суммы элементов пары могут быть отрицательными (диапазон обычно от −10 000 до 10 000), и если искомый максимум суммы получится отрицательным, сравнение с нулём его «потеряет»: программа никогда не заменит best на отрицательное число, и в ответ уйдёт неверный ноль.
Если условие задачи требует минимум (как в примере 3 ниже), логика та же, но сравнение — value < best, и инициализация None нужна ещё сильнее: если по ошибке поставить best = 0, а все найденные значения окажутся положительными, программа никогда не обновит best — он так и останется нулём, хотя реального нуля среди пар нет вообще.
Что такое «пара»: соседние элементы или любые два
Это самая частая причина потери балла на задании 17. Слово «пара» само по себе ничего не значит — значение задаёт формулировка условия, и она бывает ровно двух видов:
- «под парой подразумевается два идущих подряд элемента последовательности» — берём только соседей и , всего кандидатов;
- «пара элементов последовательности» без уточнения (или явно «любые два элемента») — берутся любые два различных элемента, не обязательно соседние, всего кандидатов.
В открытом банке ФИПИ подавляющее большинство заданий 17 прямо оговаривают первый вариант — «два идущих подряд элемента», и тогда правильный шаблон — цикл по индексу с шагом 1, как в блоке выше:
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]Если же условие говорит о любых двух элементах последовательности без требования соседства, нужен двойной цикл (или его более быстрый эквивалент), перебирающий все неупорядоченные пары индексов:
n = len(a)
for i in range(n):
for j in range(i + 1, n):
x, y = a[i], a[j]Разница не косметическая: на одной и той же последовательности эти два цикла дают разные ответы — и количество, и экстремум, потому что во втором случае кандидатов на пару всегда намного больше. Прежде чем писать код, найдите в условии фразу «под парой подразумевается…» и решите, какой из двух циклов вам нужен, — это первое, что стоит сделать, а не последнее.
Предварительный проход для вспомогательных величин
Часто условие ссылается на величину, которую нужно знать заранее, до основного прохода по парам — например, «сумма элементов пары не более максимального элемента последовательности, кратного 3» или «максимальный элемент последовательности, оканчивающийся на 13». Эта величина считается по всей последовательности, а не только среди подходящих пар, поэтому нужен отдельный, более ранний проход:
max_div3 = max(x for x in a if x % 3 == 0)
count = 0
best = None
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]
if (x % 3 == 0 or y % 3 == 0) and x + y <= max_div3:
count += 1
if best is None or x + y > best:
best = x + y
print(count, best)Частая ошибка — искать этот «порог» внутри основного цикла, обновляя его на лету по мере перебора пар. Так вы получите максимум, кратный 3, среди уже просмотренных элементов, а не среди всей последовательности — и он будет неверным для пар в начале файла. Два прохода — не оптимизация, а требование корректности.
Последняя цифра и делимость: ловушка отрицательных чисел
Проверка делимости в Python работает одинаково для положительных и отрицательных чисел: x % 3 == 0 корректно определяет кратность 3 независимо от знака x, потому что остаток от деления на 3 равен нулю в любом случае, если число кратно 3.
А вот с последней цифрой так не получится. Оператор % в Python всегда возвращает остаток того же знака, что и делитель, поэтому для отрицательного числа он не даёт «последнюю цифру» в привычном смысле:
print(-13 % 10) # 7, а не 3
print(abs(-13) % 10) # 3 — верноЧисло −13 оканчивается цифрой «3», но -13 % 10 вернёт 7. Правильная проверка последней цифры — всегда через abs():
def last_digit(x):
return abs(x) % 10
if last_digit(x) == 3:
...Возьмите это правило за привычку: как только в условии написано «оканчивается на цифру N» — сразу оборачивайте выражение в abs(), даже если кажется, что все числа в файле положительные. Диапазон задания 17 почти всегда включает отрицательные значения (обычно от −10 000 до 10 000), и хотя бы одно отрицательное число в файле встретится наверняка.
Алгоритм решения задания 17
- Прочитайте условие целиком и найдите определение пары. Ищите фразу «под парой (тройкой) подразумевается…» — от неё зависит, какой цикл писать: по соседним индексам или по всем парам индексов.
- Выпишите свойство пары и искомый экстремум. Что проверяем (делимость, последняя цифра, диапазон значений) и что ищем — сумму, произведение, разность, максимум или минимум. Проверьте, нужен ли
abs()для последней цифры. - Определите, нужен ли предварительный проход. Если в условии есть вспомогательная величина по всей последовательности («максимальный элемент, кратный 3», «оканчивающийся на …») — посчитайте её отдельным проходом до основного цикла.
- Прочитайте файл.
a = list(map(int, open("17.txt").readlines())). Проверьтеlen(a)и несколько значений. - Напишите основной проход со счётчиком
countи экстремумомbest, инициализированнымNone(не нулём — суммы и произведения бывают отрицательными или все ненулевыми в одну сторону). - Проверьте на маленьком примере, который сможете посчитать вручную (см. раздел ниже) — это быстрее, чем искать ошибку на файле из тысяч чисел.
- Запишите оба числа в порядке условия. «Сначала …, затем …» — это буквально порядок ячеек ответа, перепутать нельзя.
Доведите шаблон до автоматизма
Прорешайте 10–15 заданий 17 подряд — и чтение файла, проход по парам и инициализация экстремума перестанут требовать раздумий. Задания из банка ФИПИ с проверкой ответа — на Repet.ai.
Примеры с разбором
Мини-пример для проверки своего кода
Прежде чем запускать программу на файле из тысяч чисел, всегда проверяйте её на маленькой последовательности, которую можно посчитать вручную. Возьмём десять чисел:
a = [15, -23, 8, -13, 21, 13, -9, 33, -6, 13]Условие: «пара — хотя бы одно число делится на 3, сумма пары не более максимального элемента последовательности, кратного 3».
Шаг 1 (предварительный проход). Элементы, кратные 3: 15, 21, −9, 33, −6 → максимум из них — 33.
Шаг 2 (пары идущих подряд элементов, условие на сумму ):
(15, -23) → -8 (кратно 3: 15)
(-13, 21) → 8 (кратно 3: 21)
(13, -9) → 4 (кратно 3: -9)
(-9, 33) → 24 (кратно 3: -9 и 33)
(33, -6) → 27 (кратно 3: 33 и -6)
(-6, 13) → 7 (кратно 3: -6)Все шесть сумм не превышают 33, значит все шесть пар подходят: count = 6, максимальная сумма среди них — 27. Запустив шаблон из раздела «Предварительный проход» на этом массиве, вы должны получить ровно 6 27.
А теперь смените определение пары на «любые два элемента последовательности» и запустите двойной цикл на том же массиве — получится 27 29: кандидатов стало намного больше (не только соседи), и оба числа ответа изменились. Если ваш код на реальном задании не сходится с эталоном — в первую очередь перепроверьте, какой из двух циклов вы написали.
Тот же массив, ловушка с минимумом
Теперь другое условие: «пара — оба числа оканчиваются на нечётную цифру, ищем минимальное произведение модулей». Пары идущих подряд элементов с этим свойством:
(15, -23) → |15·-23| = 345
(-13, 21) → |-13·21| = 273
(21, 13) → |21·13| = 273
(13, -9) → |13·-9| = 117
(-9, 33) → |-9·33| = 297Верный минимум — 117. Но если по невнимательности инициализировать best = 0 и сравнивать value < best, ни одно из чисел 345, 273, 273, 117, 297 не окажется меньше нуля — переменная best так и останется 0, хотя такой пары в массиве нет вообще. Это ровно та ошибка инициализации, о которой предупреждает раздел теории выше, и она не выдаёт ни исключения, ни предупреждения — просто тихо портит ответ.
Пример 1. Пары с суммой не более порога, кратного 3
Условие (реальное задание из открытого банка ФИПИ):
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от −10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых хотя бы одно число делится на 3, а сумма элементов пары не более максимального элемента последовательности, кратного 3. В ответе запишите количество найденных пар, затем максимальную из сумм элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Решение:
Файл содержит 5000 целых чисел, по одному в строке. Определение пары — «два идущих подряд элемента», значит цикл с шагом 1. Свойство пары — «хотя бы одно число делится на 3», порог — максимальный элемент всей последовательности, кратный 3, его нужно найти предварительным проходом:
a = list(map(int, open("52900_17.txt").readlines()))
max_div3 = max(x for x in a if x % 3 == 0)
count = 0
best = None
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]
if (x % 3 == 0 or y % 3 == 0) and x + y <= max_div3:
count += 1
if best is None or x + y > best:
best = x + y
print(count, best)Программа на этом файле печатает 2439 998.
Ответ: 2439 998. Проверка здравым смыслом: последовательность содержит 5000 чисел, значит кандидатов на пару — 4999, и 2439 подходящих пар — это меньше половины, разумное число для условия «хотя бы одно из двух» (а не «оба»). Максимальная сумма 998 меньше порога max_div3, как и требует условие — иначе была бы ошибка в самом коде.
Пример 2. Пары с одинаковой последней цифрой, максимум произведения
Условие (реальное задание из открытого банка ФИПИ):
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от −10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются на одну и ту же нечётную цифру, затем максимальное из произведений модулей элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Решение:
Здесь свойство пары завязано на последнюю цифру — сразу оборачиваем в abs(). Экстремум — максимум, значит best = None и сравнение >:
a = list(map(int, open("44122_17.txt").readlines()))
def last_digit(x):
return abs(x) % 10
count = 0
best = None
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]
dx, dy = last_digit(x), last_digit(y)
if dx % 2 == 1 and dx == dy:
count += 1
p = abs(x) * abs(y)
if best is None or p > best:
best = p
print(count, best)Файл содержит 4500 чисел. Программа печатает 227 96784219.
Ответ: 227 96784219. Проверка: условие требует одну и ту же нечётную цифру у обоих чисел пары — это более редкое совпадение, чем «хотя бы одно свойство», поэтому 227 подходящих пар из 4499 возможных выглядит правдоподобно. Произведение модулей двух пятизначных чисел легко достигает восьми-девяти цифр, так что ответ порядка 9,7 × 10⁷ не удивляет.
Пример 3. Пары с разными нечётными цифрами, минимум произведения
Условие (реальное задание из открытого банка ФИПИ):
В файле содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от −10 000 до 10 000 включительно. Определите и запишите в ответе сначала количество пар элементов последовательности, в которых оба числа оканчиваются на нечётные цифры, различные для элементов в паре, затем минимальное из произведений модулей элементов таких пар. В данной задаче под парой подразумевается два идущих подряд элемента последовательности.
Решение:
Это тот самый случай минимума: инициализируем best = None и сравниваем на «меньше»:
a = list(map(int, open("44124_17.txt").readlines()))
def last_digit(x):
return abs(x) % 10
count = 0
best = None
for i in range(len(a) - 1):
x, y = a[i], a[i + 1]
dx, dy = last_digit(x), last_digit(y)
if dx % 2 == 1 and dy % 2 == 1 and dx != dy:
count += 1
p = abs(x) * abs(y)
if best is None or p < best:
best = p
print(count, best)Файл содержит 4500 чисел. Программа печатает 864 4683.
Ответ: 864 4683. Проверка: минимальное произведение двух модулей, каждый из которых заканчивается на нечётную цифру и не равен нулю, не может быть меньше ; полученные 4683 — вполне разумная величина для двух случайных чисел из диапазона до 10 000. Обратное задание с тем же текстом условия, но другим файлом (id 44118), даёт другой ответ — 1020 17197 — это подтверждает, что ответ зависит от конкретного файла, а не является константой для этой формулировки.
Типичные ошибки
Перепутали «соседние элементы» и «любые два». Самая частая ошибка на этом задании. Не нашли в условии фразу «под парой подразумевается…» — и написали не тот цикл. На маленьком тестовом примере это сразу видно: числа ответа отличаются в разы (в мини-примере из статьи — 6 против 27).
Посчитали вспомогательный максимум только среди подходящих пар, а не по всей последовательности. Если условие говорит «максимальный элемент последовательности, кратный 3» — это максимум по всему файлу, найденный отдельным проходом до основного цикла, а не по ходу перебора пар.
Инициализировали максимум нулём. Если суммы или произведения пар могут быть отрицательными, а программа ищет максимум, сравнение с 0 тихо отбросит все отрицательные варианты. Инициализируйте best = None.
Инициализировали минимум нулём. Зеркальная ошибка: если все найденные значения положительны, а программа ищет минимум, best = 0 никогда не обновится, и в ответе окажется несуществующий ноль.
Проверяли последнюю цифру через x % 10 без abs(). Для отрицательных чисел Python возвращает остаток того же знака, что и делитель: -13 % 10 равно 7, а не 3. Проверка «оканчивается на 3» без abs() пропустит все подходящие отрицательные числа.
Перепутали порядок чисел в ответе. Условие почти всегда явно диктует порядок: «запишите сначала…, затем…». Оба числа могут быть верными по отдельности, но если они стоят не в тех ячейках — ответ не совпадёт с эталоном целиком.
Не проверили код на маленьком примере. Ошибку в диапазоне 5000 чисел искать долго и почти невозможно вручную. Пять-десять чисел, посчитанные на бумаге, находят опечатку в условии цикла за минуту.
Как задание 17 связано с остальным экзаменом
Задание 17 — не единственное на КЕГЭ, где нужно писать программу, читать файл и работать с числовыми свойствами. Вот с чем полезно сопоставить:
- Задание 26 — тот же элемент содержания 3.10 и тот же файл `*.txt`, но программа сложнее (нужна сортировка), уровень высокий, а балл — 2, и здесь есть частичный зачёт: одно верное число из двух даёт 1 балл вместо 0.
- Задание 24 — тоже требует файл и программу 10–20 строк, но обрабатывает символьную, а не числовую информацию (КЭС 3.9).
- Задание 18 — та же форма ответа «два числа в двух ячейках», но данные обрабатываются в электронных таблицах, а не программой.
- Задание 16 — тоже требует среды программирования (рекуррентные выражения), но без входного файла: все данные — в тексте условия.
- Задание 25 — обработка целочисленной информации программой 10–20 строк, высокий уровень, но ответ — не два числа, а таблица N×2.
Все перечисленные линии, кроме 25 и 26, оцениваются по одному и тому же правилу: ответ либо полностью совпадает с эталоном, либо 0 баллов. Тренируйте задание 17 отдельно от остальных «файловых» заданий — определение пары и инициализация экстремума требуют своей, отдельной привычки:
План подготовки на 3 недели
Неделя 1 — базовый шаблон
День 1–2: отработайте чтение файла (open, readlines, map(int, ...)) и один проход по соседним элементам на 5–10 маленьких самодельных последовательностях, которые считаете вручную. День 3–4: добавьте условия на делимость и последнюю цифру, каждый раз проверяя abs() для отрицательных чисел. День 5–7: решите пять заданий 17 из открытого банка с определением «два идущих подряд элемента» — это самый частый вариант.
Неделя 2 — экстремумы и предварительный проход
День 1–2: отработайте инициализацию best = None и для максимума, и для минимума, специально придумав примеры, где best = 0 дал бы неверный ответ. День 3–5: решите задания, где нужен предварительный проход (порог зависит от всей последовательности) — считайте вспомогательную величину отдельным циклом до основного. День 6–7: найдите в банке задание, где «пара» — это любые два элемента, а не соседние, и решите его двойным циклом.
Неделя 3 — скорость и надёжность
День 1–3: решайте задания на время — по 14 минут на задание, включая написание кода и его проверку на маленьком примере. День 4–5: для каждого решённого задания намеренно внесите одну из типичных ошибок (уберите abs(), замените None на 0) и убедитесь, что ответ меняется — так вы научитесь узнавать симптомы этих ошибок. День 6–7: прорешайте задания 17 и 26 подряд, чтобы почувствовать разницу в сложности программы и в правилах оценивания, и проверьте себя в тренажёре на заданиях из банка ФИПИ.
Проверьте себя на реальных заданиях
На Repet.ai собраны задания ЕГЭ по информатике из открытого банка ФИПИ с прикреплёнными файлами. Решайте онлайн, проверяйте ответ мгновенно — бесплатно.
Часто задаваемые вопросы
Умение составить алгоритм обработки числовой последовательности и записать его в виде простой программы из 10–15 строк — так формулирует задание ФИПИ. К заданию прилагается текстовый файл с последовательностью целых чисел, нужно найти пары (или тройки) элементов с заданным свойством и посчитать их количество и экстремум (сумму, произведение). Раздел кодификатора — «Алгоритмы и программирование», элемент содержания 3.10, требование 2.12.
1 первичный балл, и частичного зачёта нет: ответ либо полностью совпадает с эталоном (оба числа верны), либо задание оценивается в 0 баллов. Это отличает задание 17 от задания 26, где за одно верное число из двух можно получить половину баллов. Уровень сложности — повышенный, рекомендуемое время по спецификации ФИПИ — 14 минут.
Определение задаёт сам текст условия, а не общее правило. Если написано «под парой подразумевается два идущих подряд элемента последовательности» — берутся только соседние элементы, и нужен обычный цикл с шагом 1. Если условие говорит о любых двух элементах без уточнения о соседстве, нужен двойной цикл, перебирающий все пары индексов. Эти два варианта дают разные ответы на одних и тех же данных, поэтому определение пары нужно найти в условии в первую очередь.
Диапазон значений в задании 17 обычно включает отрицательные числа (например, от −10 000 до 10 000), поэтому суммы или произведения пар тоже бывают отрицательными. Если инициализировать переменную для поиска максимума нулём, программа никогда не заменит её на отрицательное значение и выдаст неверный ноль вместо настоящего ответа. Та же проблема возникает при поиске минимума среди положительных значений. Правильная инициализация — None, с последующей проверкой best is None or условие сравнения.
Через abs(). В Python оператор % для отрицательного числа возвращает остаток того же знака, что и делитель: -13 % 10 равно 7, а не 3, хотя число -13 оканчивается цифрой 3. Правильная проверка — abs(x) % 10 == 3. Проверки на делимость (x % 3 == 0) этой проблеме не подвержены и работают одинаково для любого знака числа.
Да, если условие ссылается на величину, которая считается по всей последовательности, а не только среди подходящих пар — например, «максимальный элемент последовательности, кратный 3». Такую величину нужно найти отдельным проходом до основного цикла по парам, иначе порог будет неверным: посчитанный на лету максимум зависит от того, докуда дошёл перебор, а не от всего файла.
Стандартный шаблон: a = list(map(int, open("файл.txt").readlines())). Функция readlines читает файл построчно, а map(int, ...) переводит каждую строку в целое число, автоматически съедая символ переноса строки. Если в конце файла есть пустая строка, надёжнее использовать [int(s) for s in f if s.strip()].
В том порядке, который указан в условии — обычно «запишите в ответе сначала количество найденных пар, затем максимальную (минимальную) из сумм (произведений) элементов таких пар». Порядок ячеек в таблице ответов соответствует этому порядку буквально: перепутанные местами числа считаются неверным ответом, даже если оба числа сами по себе верны.
Готовы взять балл повышенного уровня?
Задание 17 решается по устойчивому шаблону: прочитать файл, определить, что такое «пара» в этом условии, пройти один раз с правильно инициализированным экстремумом. Отработайте этот шаблон на реальных заданиях из открытого банка ФИПИ с мгновенной проверкой ответа — и задание перестанет требовать импровизации на экзамене.