Обработка числовых последовательностей и файлов на 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). Результаты накапливают в переменных-счётчиках, инициализированных до цикла.
- ·До 10 000 чисел
- ·Допустим двойной цикл
- ·Ответ — два числа через пробел
- ·Главный риск — неверно прочитанное условие
- ·Сотни тысяч чисел
- ·Только один проход по данным
- ·Хранить не всё, а нужные максимумы
- ·Главный риск — превышение времени
Конструкции, которые нужны постоянно
| Задача | Код | Комментарий |
|---|---|---|
| Трёхзначное число | 100 <= x <= 999 | границы включительно |
| Кратно 3 | x % 3 == 0 | остаток равен нулю |
| Последняя цифра | x % 10 | не срез строки |
| Сумма цифр | sum(map(int, str(x))) | через строку |
| Максимум пустого | mx = -10**9 | инициализация до цикла |
Условие: в файле 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». Порядок строго такой, как в условии.
Условие: в первой строке файла записано количество товаров 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(), сравнение не идёт по строкам
- ✓Границы диапазонов включительные там, где сказано «включительно»
- ✓Пары/тройки берутся из идущих подряд элементов
- ✓Счётчики и максимум инициализированы до цикла
- ✓Выведены оба числа в требуемом порядке через один пробел
- ✓Программа проверена на маленьком тестовом файле из условия