Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the acf domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /var/www/html/wp-includes/functions.php on line 6131 Алгоритм обработки числовой последовательности (пары, тройки элементов) – 100балльный репетитор

Алгоритм обработки числовой последовательности (пары, тройки элементов)

10 класс

Поделиться статьей:

Informatics

Введение

Ты в 11-м классе, открываешь КИМ ЕГЭ по информатике и видишь задание с файлом на 100 000 чисел. С чего начать — непонятно? Знакомая ситуация. Многие теряют баллы в задании № 17 просто потому, что путаются в индексах или забывают про отрицательные числа.

На самом деле задачи на обработку числовых последовательностей (пары и тройки элементов) — одна из самых понятных и шаблонных тем в школьной информатике. Стоит разобраться в базовых принципах работы с массивами — и такие задания начинают решаться за три-четыре минуты.

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

Массивы и последовательности чисел

В Python числовая последовательность из файла обычно считывается в список (массив). Массив — это просто набор данных, где у каждого элемента есть свой порядковый номер (индекс). Важно помнить: индексы в Python начинаются с нуля.

Первое, что мы делаем в задаче, — забираем числа из текста в память программы:

a = [int(x) for x in open(’17.txt’)]

Эта строчка с объяснением означает: «Пройдись по всем строкам файла 17.txt, преврати каждую строку в целое число (int) и положи в список a».

Вычисление обобщённых характеристик

Часто перед тем, как искать пары, нам нужно узнать что-то про весь массив целиком.

  • Минимальный и максимальный элементы. Находятся встроенными функциями min(a) и max(a).
  • Сумма всех элементов. Функция sum(a).
  • Количество элементов по условию. Например, нам нужно найти количество всех элементов, которые оканчиваются на 5.

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

Пример: найдём минимальный элемент, который делится на 15.

min_val = min([x for x in a if x % 15 == 0])

Сортировка одномерного массива

Иногда (редко в задании № 17, но в других, например в № 9 или 26) массив нужно отсортировать по возрастанию. Для этого используется метод .sort().

a.sort() # Массив ‘a’ теперь отсортирован от меньшего к большему

Пары, тройки и индексы

Если мы ищем элементы, которые стоят рядом, нам нужен цикл по индексам i.

  • Текущий элемент: a[i].
  • Следующий элемент: a[i+1].
  • Элемент через один: a[i+2].

Чтобы программа не выдала ошибку IndexError (выход за границы массива), мы должны правильно настроить цикл:

  • Для пар цикл идёт до последнего минус один: for i in range(len(a) – 1)
  • Для троек цикл идёт до последнего минус два: for i in range(len(a) – 2)
Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

Пошаговый алгоритм решения задания № 17

Чтобы написать правильный код для любой задачи этого типа, используй этот шаблон действий:

  1. Считай данные из файла в массив.
  2. Сделай первый проход (линейный поиск), если задача требует найти какую-то глобальную переменную (например, максимальный элемент, который оканчивается на 13).
  3. Создай переменные для ответа: счётчик count = 0 и переменную для максимальной/минимальной суммы (например, max_sum = -10**10, min_sum = 10**10).
  4. Запусти цикл по индексам (до len(a)-1 для пар или len(a)-2 для троек).
  5. Проверь условия для текущей группы элементов с помощью if.
  6. Если условие выполняется, обнови ответы (увеличь счётчик, обнови максимальную/минимальную сумму).
  7. Выведи результат.

Разбор задач из экзамена

Давай посмотрим, как решать реальные задачи, применяя наш алгоритм.

Работа с парами

Условие

В файле содержится последовательность чисел от 1 до 100 000. Определите количество пар последовательности, в которых только один из элементов является двузначным числом, а сумма элементов пары кратна минимальному двузначному элементу всей последовательности. В ответе запишите количество таких пар, затем максимальную из сумм элементов таких пар. Пара — это два идущих подряд элемента.

Шаги 1 и 2. Считаем файл и ищем минимальный двузначный элемент.

a = [int(x) for x in open(’17.txt’)]

# Двузначные числа лежат в диапазоне от 10 до 99

min_double = min([x for x in a if 10 <= abs(x) <= 99])

Почему abs(x)? Хотя в условии сказано, что числа от 1, привыкай брать модуль. Если в файле будут отрицательные числа, −15 — это тоже двузначное число.

Шаг 3. Задаём переменные для ответа.

count = 0

max_sum = -10**10 # Берём очень маленькое число для старта

Шаги 4–6. Запускаем алгоритм обработки пар. Нам нужно, чтобы строго один элемент был двузначным. Самый элегантный способ в Python — сложить логические условия (истина = 1, ложь = 0).

for i in range(len(a) – 1):

# Проверяем оба элемента пары на «двузначность»

cond1 = 10 <= abs(a[i]) <= 99

cond2 = 10 <= abs(a[i+1]) <= 99

# «Только один» означает, что сумма этих истин равна 1

if cond1 + cond2 == 1:

# Проверяем второе условие: сумма кратна min_double

if (a[i] + a[i+1]) % min_double == 0:

count += 1

max_sum = max(max_sum, a[i] + a[i+1])

print(count, max_sum)

Работа с тройками

Условие

В файле последовательность чисел до 100 000. Определите количество троек элементов, в которых ровно два из трёх элементов являются трёхзначными числами, а сумма элементов тройки не больше максимального элемента последовательности, оканчивающегося на 13. Запишите количество троек и максимальную сумму их элементов.

Шаги 1–3. Подготовка.

a = [int(x) for x in open(’17.txt’)]

# Ищем максимальный элемент, который оканчивается на 13.

# Окончание числа проверяем через остаток от деления модуля числа на 100. Обязательно берём модуль abs(), так как у отрицательных чисел остаток от деления вычисляется по иным правилам.

max_13 = max([x for x in a if abs(x) % 100 == 13])

count = 0

max_sum = -10**10

Шаги 4–7. Цикл для троек.

# Для троек идём до len(a) – 2!

for i in range(len(a) – 2):

# Проверяем на трёхзначность каждый элемент (от 100 до 999)

# Складываем условия и проверяем, что их ровно 2

three_digit_count = (100 <= abs(a[i]) <= 999) + \

(100 <= abs(a[i+1]) <= 999) + \

(100 <= abs(a[i+2]) <= 999)

if three_digit_count == 2:

current_sum = a[i] + a[i+1] + a[i+2]

# Второе условие: сумма не больше max_13

if current_sum <= max_13:

count += 1

max_sum = max(max_sum, current_sum)

print(count, max_sum)

Комментарий: мы использовали \ для переноса длинной строки. Логика условие1 + условие2 + условие3 == 2 избавляет нас от написания километровых проверок через and и or.

Типичные ошибки

Здесь теряют баллы в 90% случаев. Проверяй себя по этому списку:

  1. Выход за границы массива (IndexError).
    • Как нельзя: писать for i in range(len(a)) при поиске пар.
    • Как нужно: для пар range(len(a)-1), для троек range(len(a)-2).
    • Почему: если i станет последним индексом списка, вызов a[i+1] попытается получить элемент, которого не существует. Программа экстренно завершится.
  2. Остаток от деления отрицательных чисел.
    • Как нельзя: x % 10 == 3 (если x может быть отрицательным). Дело в том, что в Python -13 % 10 выдаст 7, а не 3.
    • Как нужно: abs(x) % 10 == 3. Сначала отбрасываем знак модулем, потом смотрим окончание.
  3. Длина числа (двузначные, трёхзначные).
    • Как нельзя: len(str(x)) == 2. Если x = -15, программа переведёт его в строку “-15”, длина которой равна 3 (минус тоже символ).
    • Как нужно: математическое сравнение 10 <= abs(x) <= 99 или же len(str(abs(x))) == 2, с помощью abs() отбрасываем знак у числа и далее переводим в строку для получения длины.
  4. Поиск начального максимума.
    • Как нельзя: max_sum = 0. Если все подходящие суммы в файле окажутся отрицательными (например, наибольшая будет -15), в ответе выведется 0 — и ответ будет неверным.
    • Как нужно: объявляем переменную очень маленьким числом, например max_sum = -10**10, или сохраняем суммы в отдельный массив и в конце применяем функцию max(sums_list). Аналогично для нахождения минимального значения объявляем переменную очень большим числом.

Заключение

Подведём итог.

  1. Разбивай решение на два прохода, если нужно найти общее свойство массива (минимум, максимум, среднее): сначала находишь его, затем работаешь с парами или тройками.
  2. Следи за индексами: для пар — len(a) – 1, для троек — len(a) – 2.
  3. Используй модуль abs(x), чтобы корректно работать с отрицательными числами — особенно перед операциями с остатком (%) и проверкой разрядности.
  4. Упрощай условия: вместо громоздких and/or удобно использовать сумму логических выражений — это снижает риск ошибок.

Главное — понять логику. Тогда задание № 17 перестанет казаться сложным и превратится в предсказуемую задачу на применение шаблона. Немного практики — и это уже лёгкие баллы на экзамене.

Сохрани шаблон, прорешай несколько вариантов из ФИПИ — и на экзамене ты точно будешь чувствовать себя уверенно.

Забирай курсы подготовки к ОГЭ и ЕГЭ с жирной скидкой

В 100б ты пробьёшь свой
максимум на экзаменах

наши лучшие курсы

Выбери подходящий курс и предмет, чтобы прокачаться и сдать ОГЭ на «5», а ЕГЭ на 80+ баллов

Выбрать курс

бесплатные материалы

Курсы, вебы, чек-листы — всё за 0 ₽

Забрать за 0 ₽

Интенсив по поступлению

Запишись на интенсив по поступлению, чтобы
взять из ЕГЭ максимум и попасть в вуз мечты

Записаться
В 100балльном репетиторе ты пробьёшь свой максимум на экзаменах

Преимущества подготовки
в 100балльном

10+
лет средний опыт наших преподавателей

18
выпускников сдали ЕГЭ
на 200 из 200 в 2024 году

300k+
учеников поступили в вуз мечты с нашей помощью 

14%
стобалльников России — наши выпускники

2 347
выпускника сдали ЕГЭ на 100 баллов

Преимущества подготовки в 100балльном

Запишись
на бесплатный
вводный урок

Познакомим с преподавателями и платформой

Расскажем про учёбу

Поможем поставить цель

  • 11 класс
  • 10 класс
  • 9 класс
  • 8 класс
  • 7 класс
Запись на вводный урок