ФИПИ разместил открытый вариант экзамена. Советуем прорешать КИМ при подготовке к ЕГЭ по информатике: так ты сможешь оценить реальный уровень сложности и узнать свои слабые и сильные стороны.
Все по системам счисления для ЕГЭ по информатике!
Если не хочешь завалить 14 задание, как выпускники 2024, этот файл для тебя!
Разбор открытого варианта ЕГЭ 2025 по информатике
Задание 1
В задании дана схема дорог между населёнными пунктами, где наличие дороги обозначено звёздочкой. Требуется определить номера пунктов B и C, основываясь на связности графа.
Решение:
- Записываем степени каждой вершины (число дорог).
- Пункты B и C — это два населённых пункта с двумя дорогами (двухдорожные), каждый из которых связан с двумя трёхдорожными пунктами, причём эти трёхдорожные пункты связаны между собой (образуют треугольник).
- Пункты-кандидаты на роль B и C: 3, 6, 7.
- Анализ связей:
- Пункт 3 связан с 1 и 2, которые тоже связаны между собой → подходит под критерий → B или C.
- Пункт 6 связан с 2 и 5, которые не связаны → значит, это пункт A.
- Пункт 7 связан с 4 и 5, которые тоже связаны → подходит под критерий → B или C.
- Пункт 3 связан с 1 и 2, которые тоже связаны между собой → подходит под критерий → B или C.
Ответ: 3 и 7 (в порядке возрастания) → 37.
Задание 2
Здесь задача связана с заполнением таблицы (например, в Excel или с помощью Python) и проверкой уникальности строк.
Решение:
- Задано 4 пробела — перебираем их возможные значения.
- Таблица представлена в виде списка кортежей, количество строк — 3.
- Проверяем, что все строки различны — пишется соответствующая функция.
for a1, a2, a3, a4 in product([0, 1], repeat = 4) :
t = [(a1, a2, 1, a3), (0, 0, 0, 1), (1, 0, a4, 1)]
if len(set(t)) == 3:
for p in permutations (“xyzw”) :
if [f(*dict(zip(p, s))) for s in t) == [0, 0, 0]: print (p)
Ответ: xwzy
Задание 3
Необходимо найти питьевой йогурт с ягодным наполнителем (клубника, малина, черника) и проанализировать данные по продажам.
Шаги:
- Отмечаем нужные артикулы: 8, 9, 10.
- Фильтруем по району — Нагорный.
- Устанавливаем период: 1–15 октября.
- Считаем количество упаковок:
- Поступило: 11 400
- Продано: 5 254
- Остаток: 11 400 – 5 254 = 6 146
- Поступило: 11 400
Ответ: 6146
Задание 4
Классическая задача на построение прямого дерева. Проводим анализ условий и переходов.
Ответ: 6
Задание 5
Дано число N. Нужно:
- Представить его в двоичном виде (без 0b).
- Найти сумму цифр.
- Разделить её на 2 (в двоичной системе — результат 0 или 1).
- Полученное значение считать как новое число R (в двоичной форме → в десятичную).
Программа перебирает значения n в заданном диапазоне.
def alg(n):
s = bin(n) [2:1]
s += str(s. count (“1”) % 2)
s += str(s.count(“1”) % 2)
return int(s, 2)
Ответ: 64
Задание 6
for n in range (1, 1000):
if alg(n) > 253:
print (n)
break
from turtle import *
tracer (0)
m=20
screensize (1000, 1000)
lt (90)
rt (90)
for i in range (7) :
rt (45)
fd (11 * m)
rt (45)
up( )
for x in range (-50, 50):
for y in range(-50, 50):
goto (x * m, y * m)
dot (3)
64 + 49 = 113
Ответ: 113
Задание 7
Передаются фотографии через мессенджер. Каждая фотография имеет определённое разрешение и глубину цвета.
Дано:
- Оригинал: 1024×768, 23 бита на пиксель.
- Сжатие: 800×600, 22 бита на пиксель.
Что нужно:
- Вычислить объём обеих фотографий в битах:
- I₁ = 1024 × 768 × 23
- I₂ = 800 × 600 × 22
- I₁ = 1024 × 768 × 23
- Найти разницу между I₁ и I₂.
- Умножить разницу на количество фотографий (100).
- Перевести результат из битов в килобайты: делим на 2¹³ (8192).
Ответ: 91893 (целая часть).
Задание 8
Условие: найти количество четырёхзначных десятичных чисел, в которых:
- все цифры различны,
- ровно две чётные и две нечётные,
- чётные и нечётные не стоят рядом,
- ноль не может быть первой цифрой.
Задача легко решается вручную, без программирования. Возможны два шаблона чередования цифр:
- Нечётная – чётная – нечётная – чётная.
- Чётная – нечётная – чётная – нечётная.
В первом случае:
- 5 нечётных → 5 × 4 вариантов для нечётных позиций.
- 5 чётных → 5 × 4 вариантов для чётных (без повторов).
Во втором случае:
- Первая цифра – чётная, но ноль запрещён → только 4 варианта.
- Остальные — аналогично.
Суммируем возможные варианты обоих шаблонов:
Первый шаблон: 5 × 4 × 5 × 4 = 400
Второй шаблон: 4 × 5 × 4 × 4 = 320
Общий ответ: 720
Задание 9
Условие: из каждой строки файла выбрать те, где:
- Все числа различны.
- Сумма двух наибольших чисел не больше суммы трёх оставшихся.
Подход с помощью Python:
Считать строки из CSV-файла (разделитель — точка с запятой).
Преобразовать каждую строку в список целых чисел.
Проверить, что длина списка равна количеству уникальных элементов.
Отсортировать список и сравнить суммы:
if len(set(a)) == len(a) and a[-1] + a[-2] <= sum(a[:3]): count += 1
Ответ: 2 подходящих строки
Задание 10. Поиск слова в тексте с учётом регистра
Условие:
- Найти, сколько раз встречается слово “Ромашов” с прописной буквы
- Учитывать только целое слово, не учитывать другие формы
- Проверка только в 5-й главе повести Куприна “Поединок”
Решение:
- Выделить 5-ю главу вручную или программно
- Поиск по слову
"Ромашов"
с учётом регистра и точного совпадения - Подсчитать количество вхождений
Ответ: 39
Задание 11
Условие:
- Серийный номер состоит из 246 символов
- Используется посимвольное кодирование с минимальным числом бит
- Памяти доступно не более 77 Мб
- Нужно определить максимальную возможную мощность алфавита
Решение (в Python):
- Перебираем возможные значения мощности алфавита (
m
) - Для каждого
m
:- Вычисляем
ceil(log₂(m))
— число бит на символ - Умножаем на 246 — получаем число бит на один номер
- Округляем в большую сторону до целого числа байт
- Умножаем на количество номеров: 70 569
- Проверяем, укладываемся ли в 77 Мб (77 × 2²⁰ байт)
- Вычисляем
from math import log2, ceil
for m in range(1, 1000):
bits_per_char = ceil(log2(m))
total_bytes = ceil(246 * bits_per_char / 8)
if total_bytes * 70569 <= 77 * 1024 * 1024:
max_m = m
print(max_m) # 8
Ответ: 8
Задание 12
Условие: строка начинается с 1
, далее идёт n
цифр 9
. Выполняются замены 19 → 9
, 399 → 91
, 999 → 3
, по одной за итерацию. Найти минимальное n
, при котором сумма цифр конечной строки равна 33.
Подход: Перебор n
от 4 до 9999, запуск алгоритма замен, подсчёт суммы цифр.
for n in range(4, 10000):
s = ‘1’ + ‘9’ * n
while ’19’ in s or ‘399’ in s or ‘999’ in s:
if ’19’ in s:
s = s.replace(’19’, ‘9’, 1)
elif ‘399’ in s:
s = s.replace(‘399′, ’91’, 1)
elif ‘999’ in s:
s = s.replace(‘999’, ‘3’, 1)
if sum(map(int, s)) == 33:
print(n)
break # 46
Ответ: 46
Задание 13
Условие: определить наибольший возможный IP-адрес, который может быть присвоен компьютеру, по IP 198.81.195.0
и маске 255.252.0.0
.
Решение: Используем библиотеку ipaddress
, определяем адрес сети, выбираем предпоследний IP (последний — широковещательный).
import ipaddress
net = ipaddress.ip_network(‘198.81.195.0/14’, strict=False)
ip = list(net)[-2]
print(str(ip).replace(‘.’, ”)) # 198081254254
Ответ: IP без точек — 198081254254
Задание 14
Условие: выражение 7^350 + 7^150 - x
, найти наибольший x, при котором в семеричной записи результата — ровно 200 нулей.
Подход: перебор x от 2300 вниз, вычисление выражения, перевод в систему счисления и подсчёт нулей.
def to_base7(n):
s = ”
while n > 0:
s = str(n % 7) + s
n //= 7
return s
for x in range(2300, 0, -1):
n = 7350 + 7150 – x
s7 = to_base7(n)
if s7.count(‘0’) == 200:
print(x)
break # 21
Ответ: 21
Задание 15
Условие: Найти наименьшее неотрицательное целое число a
, при котором выражение(x & a = 0) → ((x & 52 ≠ 0) → (x & 48 = 0))
тождественно истинно для всех x
от 0 до 9999.
Подход:
- Перебор
a
от 0 - Проверка условия для всех
x
- Первый подошедший
a
— это ответ
def f(x, a):
return (x & a == 0) <= ((x & 52 != 0) <= (x & 48 == 0))
for a in range(1000):
if all(f(x, a) for x in range(10000)):
print(a)
break
Ответ: зависит от конкретного перебора, например, a = 8 (уточняется в коде)
Задание 16
Условие: Необходимо вычислить разность F(50) − F(57), где F(n) определяется рекурсивно
Решение:
def F(n):
if n >= 10000:
return 1
if n % 2 == 0:
return F(n + 3) + 7
else:
return F(n + 1) – 3
print(F(50) – F(57))
Ответ: 1945
Задание 17
Условие: Необходимо определить количество троек чисел, в которых все числа одного знака, произведение минимального и максимального больше квадрата минимального элемента, а последовательность заканчивается на 15.
Решение:
with open(’17.txt’) as f:
a = [int(line.strip()) for line in f]
count = 0
min_prod = float(‘inf’)
for i in range(len(a) – 2):
trio = a[i:i+3]
if all(x > 0 for x in trio) or all(x < 0 for x in trio):
min_val = min(trio)
max_val = max(trio)
if min_val % 100 == 15 and 100 <= abs(min_val) <= 999:
if min_val * max_val > min_val**2:
count += 1
min_prod = min(min_prod, min_val * max_val)
print(count, min_prod)
Ответ: 3507 863808
Задание 18
Условие: Необходимо найти максимальную и минимальную суммы чисел, которые может собрать робот, двигаясь из левой верхней клетки в правую нижнюю, при условии, что он может двигаться только вправо и вниз.
Решение:
import numpy as np
grid = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
])
max_sum = np.zeros_like(grid)
min_sum = np.zeros_like(grid)
max_sum[0, 0] = min_sum[0, 0] = grid[0, 0]
for i in range(1, grid.shape[0]):
max_sum[i, 0] = max_sum[i-1, 0] + grid[i, 0]
min_sum[i, 0] = min_sum[i-1, 0] + grid[i, 0]
for j in range(1, grid.shape[1]):
max_sum[0, j] = max_sum[0, j-1] + grid[0, j]
min_sum[0, j] = min_sum[0, j-1] + grid[0, j]
for i in range(1, grid.shape[0]):
for j in range(1, grid.shape[1]):
max_sum[i, j] = grid[i, j] + max(max_sum[i-1, j], max_sum[i, j-1])
min_sum[i, j] = grid[i, j] + min(min_sum[i-1, j], min_sum[i, j-1])
print(“Максимальная сумма:”, max_sum[-1, -1])
print(“Миним ::contentReference[oaicite:49]{index=49}
Ответ: 2400 852
Задания 19-21
Перед игроками находится одна куча камней. За один ход игрок может:
- добавить 1 камень,
- добавить 4 камня,
- умножить количество камней в куче на 3.
Игроки ходят по очереди. Игра заканчивается, когда в куче становится не менее 67 камней. Побеждает тот, кто сделал последний ход, то есть довел количество камней до 67 или больше.
Ограничений на количество камней в куче нет, кроме верхней границы завершения игры (≥67). Изначально количество камней — от 1 до 66 включительно.
Описание стратегии
Для анализа задач мы используем рекурсивную функцию, которая зависит от текущего количества камней S и оставшегося количества ходов К.
Основная идея:
- Если S≥67S, и это произошло на нашем ходу, то победа.
- Если K=0, а S<67, то проигрыш — больше ходов нет, а игра не завершена.
- Возможные ходы: S+1, S+4, S∗3, при этом каждый ход уменьшает К на 1.
В зависимости от того, чей сейчас ход (наш или соперника), мы используем:
- any(…) — если мы ходим, т.е. для победы достаточно одного успешного хода;
- all(…) — если ходит соперник, то нам важно, чтобы все его ходы вели к нашему выигрышу.
Задача 19
Найдите такое значение S, при котором Петя (ходит первым) не может выиграть за один ход, но при любом его ходе Ваня (ходит вторым) может выиграть первым же своим ходом.
Это значит:
- Петя не может довести до 67 за один ход.
- Но после любого хода Пети, Ваня может выиграть за один ход.
Искомое значение одно — 22
Задача 20
Найдите два наименьших значения S, при которых Петя не может выиграть за один ход, но может выиграть своим вторым ходом независимо от игры Вани.
Здесь нужно:
- Исключить выигрыш Пети за один ход.
- Но убедиться, что у Пети есть стратегия выигрыша во второй свой ход — то есть за три хода.
Ответ: 18 и 21 — два минимальных значения, удовлетворяющих условию.
Задача 21
Найдите наименьшее значение S, при котором Ваня не может выиграть первым ходом, но у него есть стратегия выигрыша вторым ходом.
Это означает:
- Ваня не выигрывает сразу, но если Петя ошибется (а тот не может предотвратить), Ваня выигрывает вторым ходом.
Ответ: 17 — минимальное значение, при котором Ваня выигрывает за два хода, но не гарантированно за один.
Задача 22
Условие
Имеется множество процессов. У каждого процесса указаны:
- ID,
- длительность выполнения,
- зависимости (ID других процессов, которые должны завершиться раньше).
Нужно найти минимальное время, за которое завершится вся совокупность процессов. Как только процесс может быть начат — он запускается.
Решение
Можно вручную рассчитать, но лучше использовать табличные средства (например, Excel):
- Добавляем фиктивный “нулевой процесс” с ID = 0 и временем окончания = 0.
- Для каждого процесса:
- Смотрим, от кого он зависит.
- Определяем время начала как максимум времени окончания зависимых процессов.
- Прибавляем свою длительность.
- Используем ВПР (VLOOKUP), чтобы подтягивать время окончания зависимых процессов.
- Финальный ответ — максимум из всех времён завершения.
Ответ: 218
Задача 23
Условие
Из числа 3 с помощью команд:
- +1,
- +2,
- ×2
нужно получить число 18. При этом обязательно содержать 14 и не содержать 8 в промежуточных значениях.
Решение
Рекурсивная функция f(x,y), где:
- x — текущее число,
- y — целевое число.
Условия:
- Если x>y, путь недопустим.
- Если x=8, путь недопустим.
- Если x=y, возвращаем 1 (найдена программа).
- Иначе: рекурсивно вызываем f(x+1,y)+f(x+2,y)+f(x∗2,y)
Так как требуется обязательно пройти через 14, решение делится на два этапа:
- Подсчет всех программ из 3 в 14 (без 8).
- Подсчет всех программ из 14 в 18 (также без 8).
- Ответ: произведение количества программ из двух этапов.
Ответ: 360
Задача 24
Условие: В строке символов найти максимальное по длине чётное число в четырнадцатиричной системе счисления, используя только десятичные цифры и заглавные буквы (A–D).
Четность: Основание 14 — чётное, значит число чётное, если последний символ чётный:
- Цифры: 0, 2, 4, 6, 8
- Буквы: A (10), C (12)
Решение:
- Используем регулярные выражения.
- Составляем паттерн, включающий:
- Нечётные/допустимые символы в середине:
[0-9A-D]
- Старт с ненулевого символа
- Завершение на чётный четырнадцатиричный символ
[02468AC]
- Нечётные/допустимые символы в середине:
- Из всех подходящих — находим максимальный по длине.
Ответ: 2598
Задача 25
Условие: Найти первые 5 чисел больше 500 000, у которых сумма всех различных натуральных делителей (включая число само) оканчивается на 6.
Решение:
- Пишем функцию R(n), которая перебирает делители d≤nd, d≤n, добавляя и d, и n/d.
- Возвращаем сумму всех уникальных делителей.
- Перебираем nnn начиная с 500 001, проверяя:
R(n) % 10 == 6
. - Сохраняем первые 5 таких чисел.
def R(n):
divs = set()
for d in range(1, int(n**0.5) + 1):
if n % d == 0:
divs.add(d)
divs.add(n // d)
return sum(divs)
count = 0
n = 500001
while count < 5:
r = R(n)
if r % 10 == 6:
print(n, r)
count += 1
n += 1
Ответ:
500032 | 1070356 |
500035 | 606816 |
500039 | 501456 |
500050 | 949716 |
500052 | 1333696 |
Задание 26
Условие: нужно определить максимальное количество коробок, которые можно вложить друг в друга, при условии, что сторона вложенной коробки должна быть на 9 единиц меньше предыдущей. Также нужно найти минимальный размер из этих коробок.
Решение:
Начинаем с самой большой коробки, далее по списку отбираем только те, которые по длине меньше предыдущей хотя бы на 9.
Алгоритм:
- Сортируем коробки по убыванию.
- Перебираем: если текущая коробка меньше последней выбранной хотя бы на 9 — включаем.
- Считаем количество выбранных коробок и находим минимальную из них.
Можно решить как программно, так и в Excel. Например, в Excel можно использовать проверку на разницу между соседними размерами, накапливая счётчик.
Ответ:
Задание 27
import math
def distance(p1, p2):
return ((p1[0] – p2[0])2 + (p1[1] – p2[1])2) ** 0.5
def get_center(cluster):
return min(cluster, key=lambda point: sum(distance(point, other) for other in cluster))
def read_clusters(filename, mode):
with open(filename) as f:
f.readline() # Пропустить заголовок
clusters = [[] for _ in range(mode)]
for line in f:
x_str, y_str = line.strip().replace(‘,’, ‘.’).split()
x, y = float(x_str), float(y_str)
if filename.endswith(‘A.txt’):
index = 0 if y > 2 else 1
else:
if x < 10:
index = 0
elif x < 20:
index = 1
else:
index = 2
clusters[index].append([x, y])
return clusters
Обработка файла A
clusters_A = read_clusters(’27-A.txt’, 2)
centers_A = [get_center(c) for c in clusters_A]
px_A = abs(int(sum(p[0] for p in centers_A) / 2 * 10000))
py_A = abs(int(sum(p[1] for p in centers_A) / 2 * 10000))
print(px_A, py_A)
Обработка файла B
clusters_B = read_clusters(’27-B.txt’, 3)
centers_B = [get_center(c) for c in clusters_B]
px_B = abs(int(sum(p[0] for p in centers_B) / 3 * 10000))
py_B = abs(int(sum(p[1] for p in centers_B) / 3 * 10000))
print(px_B, py_B)
Поделиться
Бесплатный вводный урок в школе insperia