Python-решения задач ЕГЭ: от простого к сложному
Программы на Python для ЕГЭ: разбор типовых заданий
Как найти максимальную длину подряд идущих одинаковых символов в строке?
Рассмотрим задание 24 из ЕГЭ. Требуется определить наибольшее количество подряд идущих одинаковых символов в файле. Эффективное решение использует проход по строке и подсчёт текущей длины.
s = open('24.txt').read()
max_len = 1
cur_len = 1
for i in range(1, len(s)):
if s[i] == s[i-1]:
cur_len += 1
else:
max_len = max(max_len, cur_len)
cur_len = 1
max_len = max(max_len, cur_len)
print(max_len)яндекс задания python (задания от яндекса по python)
Пояснение: переменная cur_len хранит длину текущей последовательности. При каждом совпадении символа с предыдущим длина увеличивается, иначе обновляется максимум и счётчик сбрасывается. В конце нужно повторно сравнить, так как последовательность может заканчиваться в конце строки.
Типичные ошибки:
- Забыть обновить max_len после цикла, если самая длинная последовательность находится в конце.
- Неправильное чтение файла - нужно использовать read() без разбиения на строки, так как символ перевода строки может прервать последовательность.
- Начальное значение max_len = 0 - если строка не пуста, должно быть хотя бы 1.
Как определить число с нечётным количеством делителей (задание 25)?
Другой подход: можно использовать свойство полных квадратов - только они имеют нечётное количество делителей. Таким образом, задача сводится к проверке, является ли число точным квадратом.
for num in range(100, 1000):
if int(num**0.5) ** 2 == num:
print(num)Python разработчик тестовые задания (примеры тестовых заданий python)
Этот способ быстрее перебора делителей, но требует аккуратного сравнения вещественных чисел. Для больших диапазонов лучше использовать целочисленный корень через math.isqrt.
import math
for num in range(100, 1000):
sqrt = math.isqrt(num)
if sqrt * sqrt == num:
print(num)
Возможные проблемы:
- Использование int(num**0.5) может дать ложный результат из-за погрешности чисел с плавающей точкой (например, для больших чисел).
- Путаница между isqrt и sqrt - isqrt возвращает целое число.
Дополнительные примеры программ для подготовки к ЕГЭ
Ниже приведены решения типовых заданий с пояснениями.
Задание 26: Обработка файлов (покупка файлов)
Условие: Дан список размеров файлов и объём диска. Нужно выбрать максимальное количество файлов, а затем среди таких вариантов - максимальный размер выбранного файла.
with open('26.txt') as f:
data = list(map(int, f.read().split()))
disk_size = data[0]
n = data[1]
files = sorted(data[2:])
count = 0
total = 0
for size in files:
if total + size <= disk_size:
total += size
count += 1
else:
break
# Второй проход для максимизации последнего файла
remain = disk_size - total
max_file = size # последний добавленный
for i in range(count, n):
if files[i] - files[count-1] <= remain:
max_file = files[i]
print(count, max_file)
Результат: (количество выбранных файлов, максимальный размер среди них)
Задание 27: Динамика (максимальная сумма элементов с учётом разности)
Условие: Из последовательности целых чисел нужно выбрать подпоследовательность (не обязательно подряд) так, чтобы сумма была максимальной, но разность между выбранными номерами не менее заданного числа.
n = int(input())
k = int(input())
arr = [int(input()) for _ in range(n)]
dp = [0]*n
max_prev = 0
for i in range(n):
if i >= k:
max_prev = max(max_prev, dp[i-k])
dp[i] = max(arr[i], max_prev + arr[i])
print(max(dp))
Пример: при n=5, k=2, arr = [10, -5, 15, 20, -10] → ответ 25 (10+15? нет, лучше 10+20=30, но 0 и 3 разность 3>=2, 15+20=35 но разность 1<2, в итоге max=30)
Задание 16: Рекурсия с мемоизацией
Функция F(n) задана рекуррентно: F(0)=1, F(n)=F(n-1)+F(n-2) для n>0. Требуется вычислить F(20).
from functools import lru_cache
@lru_cache(None)
def F(n):
if n == 0:
return 1
if n == 1:
return 1
return F(n-1) + F(n-2)
print(F(20))
10946
Задание 24 (альтернативный метод с groupby)
from itertools import groupby
s = open('24.txt').read()
max_len = max(len(list(group)) for _, group in groupby(s))
print(max_len)
Результат тот же, что и в ручном переборе.