А
Информатика·11 класскод 2.4·11 мин

Обработка числовых последовательностей и файлов на Python

Шаблон «прочитать — отфильтровать — накопить — вывести», который закрывает задания 17, 23–27.

Тренировать тему

Задания второй части — это не задачи на изобретательность, а задачи на надёжный шаблон. Один и тот же каркас чтения файла и накопления результата работает в заданиях 17, 24, 25 и 26; отличается только условие фильтра.

Шаблон чтения данных

Файл читается один раз в список: f = open('17.txt'); a = [int(x) for x in f]. Затем последовательность обрабатывается циклами по индексам. Для пар соседних элементов используют range(len(a) − 1), для троек — range(len(a) − 2). Результаты накапливают в переменных-счётчиках, инициализированных до цикла.

Каркас решения задания 17
Прочитать в список
a = [int(x) for x in open('17.txt')]
Вычислить опорную величину
Например, максимальный трёхзначный элемент
Пройти по парам
for i in range(len(a)-1)
Накопить счётчик и максимум
cnt += 1; mx = max(mx, s)
Вывести два числа
print(cnt, mx) — через пробел
Четыре шага, одинаковые почти во всех задачах на последовательности.
Строка чтения файла
a =список чисел
[int(x)преобразование строки в целое
for x inперебор строк файла
open('17.txt')]имя файла точно как в задании
Самая частая строка на всём экзамене — запомните её дословно.
Задание 17 и задание 27 — разные ограничения
Задание 17
  • ·До 10 000 чисел
  • ·Допустим двойной цикл
  • ·Ответ — два числа через пробел
  • ·Главный риск — неверно прочитанное условие
Задание 27
  • ·Сотни тысяч чисел
  • ·Только один проход по данным
  • ·Хранить не всё, а нужные максимумы
  • ·Главный риск — превышение времени
В 17 данных мало, в 27 — миллионы, и наивный перебор не проходит по времени.

Конструкции, которые нужны постоянно

ЗадачаКодКомментарий
Трёхзначное число100 <= x <= 999границы включительно
Кратно 3x % 3 == 0остаток равен нулю
Последняя цифраx % 10не срез строки
Сумма цифрsum(map(int, str(x)))через строку
Максимум пустогоmx = -10**9инициализация до цикла
Задание 17 ЕГЭ

Условие: в файле 17.txt содержится последовательность целых чисел. Элементы последовательности могут принимать целые значения от −10 000 до 10 000 включительно. Определите количество пар последовательности, в которых сумма элементов пары не меньше максимального трёхзначного элемента последовательности, а также максимальную из сумм таких пар. Парой считается два идущих подряд элемента. В ответе запишите два числа: сначала количество пар, затем максимальную из сумм. Решение: a = [int(x) for x in open('17.txt')] m = max(x for x in a if 100 <= abs(x) <= 999) cnt = 0 mx = -10**9 for i in range(len(a) - 1): s = a[i] + a[i+1] if s >= m: cnt += 1 mx = max(mx, s) print(cnt, mx) Пояснение. Трёхзначными считаются числа, у которых три цифры, поэтому проверка ведётся по модулю: 100 ≤ |x| ≤ 999. Пары берутся только из соседних элементов, поэтому цикл идёт до len(a) − 1. В бланк: два числа через один пробел, например «112 9876». Порядок строго такой, как в условии.

Задание 26 ЕГЭ (идея решения)

Условие: в первой строке файла записано количество товаров N и сумма денег S. В следующих N строках — цены товаров. Определите максимальное количество товаров, которое можно купить, и максимальную стоимость такой покупки. Решение: f = open('26.txt') n, s = map(int, f.readline().split()) p = sorted(int(x) for x in f) k = 0 total = 0 for c in p: if total + c <= s: total += c k += 1 else: break print(k, total) Пояснение. Чтобы взять максимум товаров, покупаем самые дешёвые — отсюда сортировка. Для второго числа обычно требуется максимальная стоимость при том же количестве товаров: после нахождения k нужно проверить, можно ли заменить последний купленный товар на более дорогой, не превысив S.

Ловушка: формат ответа и границы диапазонов

Два числа записываются через один пробел в одном поле ответа — не в двух строках и не через запятую. Порядок чисел строго как в условии: сначала количество, потом максимум. Проверяйте формулировки: «не меньше» — это >=, «больше» — это >. Границы диапазона в ЕГЭ почти всегда включительные, поэтому 100 <= x <= 999, а не 100 < x < 999. И не забудьте инициализировать максимум заведомо малым числом, иначе он останется нулём.

Контроль решения
  • Имя файла в open() совпадает с указанным в задании
  • Числа преобразованы через int(), сравнение не идёт по строкам
  • Границы диапазонов включительные там, где сказано «включительно»
  • Пары/тройки берутся из идущих подряд элементов
  • Счётчики и максимум инициализированы до цикла
  • Выведены оба числа в требуемом порядке через один пробел
  • Программа проверена на маленьком тестовом файле из условия