ЕГЭ · Информатика

Задание 27 ЕГЭ по информатике 2027: разбор с решением на Python

Разбираем задание из проекта демоверсии ФИПИ: как прочитать файл, выделить кластеры, найти центры и получить ответ на Python. В конце — тренировочное задание для самостоятельной проверки.

Материал школы «Дельта»Обновлено 8 мин чтения

В проекте демоверсии ЕГЭ-2027 в задании 27 нужно обработать файл с данными о частицах. Частицы разбивают на кластеры по кинетической энергии, у каждого кластера находят центр, а затем вычисляют два числа.

Максимум за задание — 2 первичных балла; ориентировочное время по проекту спецификации — 36 минут. Центр кластера определяется через медиану энергий. На файле демоверсии подходит разрезание по K − 1 самым большим разрывам с обязательной проверкой разброса каждого кластера.

Что изменилось в 2027 году

По проекту демоверсии ФИПИ тема задания осталась прежней: анализ данных и кластеризация. Изменилось оформление:

  • к заданию прилагается один файл, а не два (A и B), как в 2026 году;
  • ответ — одна строка из двух чисел вместо двух строк;
  • в демоверсии частицы делятся на кластеры не по координатам, а по одной величине — кинетической энергии.

Разбор основан на проекте демоверсии ФИПИ, проверенном 17 октября 2026 года. После публикации утверждённых документов условия и формат ответа нужно сверить заново.

Условие своими словами

В файле до 10 000 строк. В каждой строке описана одна частица: координаты x и y, скорость Vx и Vy, масса m и признак — римское число от I до VII. Числа записаны с десятичной запятой, разделители — пробелы или табуляция.

Частицы нужно разбить на K кластеров (в демоверсии K = 4) так, чтобы внутри каждого кластера энергии любых двух частиц отличались не больше чем на R (в демоверсии R = 2,0). Условие гарантирует, что разбиение на K непустых кластеров существует и единственно. Кинетическая энергия считается по формуле

E = m · (Vx² + Vy²) / 2

Центр кластера — частица, у которой сумма модулей разностей энергий со всеми остальными частицами кластера минимальна.

Нужно найти:

  • Q1 — наибольшее евклидово расстояние на плоскости между двумя частицами одного кластера, у которых признак II;
  • Q2 — наибольшую энергию среди центров кластеров.

В ответ записывают целые части чисел Q1 × 10 000 и Q2 × 10 000.

План решения

  1. Прочитать файл, заменить запятые на точки, посчитать энергию каждой частицы.
  2. Отсортировать частицы по энергии.
  3. Для файла демоверсии разрезать отсортированный список по K − 1 самым большим разрывам. Проверить число кластеров и допустимый разброс энергий в каждом; без проверки переносить этот приём на другие данные нельзя.
  4. В каждом кластере найти центр, то есть медиану по энергии.
  5. В каждом кластере перебрать пары частиц с нужным признаком и найти наибольшее расстояние.
  6. Собрать Q1 и Q2 и вывести целые части Q1 × 10 000 и Q2 × 10 000.

Ловушка: разрыв между кластерами может быть меньше R

Первое, что хочется сделать: отсортировать энергии и начинать новый кластер там, где соседние значения отличаются больше чем на R. На файле демоверсии такой способ даёт неверный ответ.

Там энергии первого кластера лежат примерно от 1,20 до 3,10, а второго — от 4,40. Разрыв между ними около 1,3, это меньше R = 2,0. Программа «склеит» кластеры, и ответ получится неправильным.

Условие требует другого: внутри кластера энергии отличаются не больше чем на R. Расстояние между кластерами при этом может быть и меньше R. Зато мы точно знаем, что кластеров ровно K. На файле этой демоверсии подходит разрезание по K − 1 самым большим разрывам. После него обязательно проверяем, что получились K непустых кластеров и разброс энергий в каждом не превышает R. Если проверка пройдена, гарантия единственности из условия подтверждает правильность разбиения. Сам по себе выбор самых больших разрывов не гарантирует результат на произвольном файле.

Например, для энергий 0; 1,95; 1,96; 3,86; 5,80; 5,81 при K = 2 и R = 2 правильная граница проходит между 1,96 и 3,86. Самый большой разрыв находится раньше — между 0 и 1,95. Поэтому проверка в коде нужна: при ошибке разбиения программа должна остановиться, а не вывести неверный ответ.

Почему центр кластера — это медиана

Чтобы найти центр «в лоб», для каждой частицы кластера нужно посчитать сумму модулей разностей со всеми остальными. Для кластера из 800 частиц это 640 тысяч операций. Python справится, но есть способ проще.

Сумма |a₁ − x| + |a₂ − x| + … + |aₙ − x| минимальна, когда x — медиана чисел a₁, …, aₙ. При нечётном количестве различных энергий сдвиг от среднего значения увеличивает суммарное расстояние. При чётном количестве минимум достигается между двумя средними значениями, поэтому центр среди частиц может быть не единственным.

Кластер у нас уже отсортирован по энергии, поэтому его центр — средний элемент c[len(c) // 2]. В этой задаче единственность центра гарантирована условием. Если такой гарантии нет, нужно отдельно проверить чётность числа частиц и совпадающие энергии.

Решение на Python

Скачайте архив по ссылке ФИПИ в конце статьи, найдите в папке «Файлы» demo_27.txt и сохраните его рядом с программой под именем 27.txt. Код ниже предназначен для этого набора данных.

python
from math import dist

K, R = 4, 2.0          # из условия
LABEL = 'II'           # признак для Q1

data = []
for line in open('27.txt'):
    s = line.replace(',', '.').split()     # split() понимает и пробелы, и табуляцию
    if not s:
        continue
    x, y, vx, vy, m = map(float, s[:5])
    E = m * (vx**2 + vy**2) / 2
    data.append((E, x, y, s[5]))

data.sort()                                # сортируем по энергии

# для этого демофайла подходят K-1 самых больших разрывов
gaps = [(data[i][0] - data[i - 1][0], i) for i in range(1, len(data))]
cuts = sorted(i for gap, i in sorted(gaps, reverse=True)[:K - 1])
bounds = [0] + cuts + [len(data)]
clusters = [data[bounds[i]:bounds[i + 1]] for i in range(K)]

for c in clusters:                         # самопроверка
    assert c and c[-1][0] - c[0][0] <= R + 1e-9, "Проверьте разбиение"

Q1 = 0
Q2 = 0
for c in clusters:
    center = c[len(c) // 2]                # медиана = центр кластера
    Q2 = max(Q2, center[0])

    marked = [p for p in c if p[3] == LABEL]   # сравниваем строку целиком
    for i in range(len(marked)):
        for j in range(i + 1, len(marked)):
            Q1 = max(Q1, dist(marked[i][1:3], marked[j][1:3]))

print(int(Q1 * 10000), int(Q2 * 10000))

На файле из демоверсии ФИПИ программа выдаёт 539936 100704 — это совпадает с официальным ответом. Время выполнения зависит от компьютера и размера выборки.

Частые ошибки

ОшибкаКак избежать
Программа падает на числах вида 2,98Перед преобразованием в число заменить запятую на точку: line.replace(',', '.')
Разбор строки ломается на табуляцииИспользовать split() без аргументов: он делит строку по любым пробельным символам
Частицы с признаком III попадают в выборку для IIСравнивать признак целиком: p[3] == 'II', а не 'II' in p[3]
Кластеры «склеиваются»Не сравнивать разрыв с R. Для этого демофайла использовать K − 1 наибольших разрывов и обязательно проверять разброс каждого кластера
Q1 посчитан по всему файлуРасстояние берётся между частицами одного кластера. Перебирать пары внутри каждого кластера отдельно
Забыли разделить на 2 в формуле энергииE = m · (Vx² + Vy²) / 2. Проверьте на примере из условия: для первой строки должно получиться 2,5
Ответ округлилиНужна целая часть: int(), а не round()
Числа в ответе перепутаны местамиСначала Q1, затем Q2, через пробел в одной строке

Проверьте себя: тренировочное задание

Мы подготовили собственный файл в формате демоверсии: ege27_trenirovka.txt. В нём 2203 частицы.

Условие. Частицы делятся ровно на 3 кластера (K = 3), для каждого R = 1,5. Найдите:

  • Q1 — наибольшее евклидово расстояние между частицами одного кластера с признаком IV;
  • Q2 — минимальную кинетическую энергию среди центров кластеров.

Запишите целые части Q1 × 10 000 и Q2 × 10 000.

Подсказка: в этом файле разрывы между кластерами тоже меньше R. Попробуйте сначала «наивный» способ и посмотрите, сколько кластеров он найдёт.

Показать ответ

660949 27007

Если получилось другое, проверьте три вещи: сколько кластеров нашла программа, какой признак вы сравниваете и берёте ли вы минимум, а не максимум, для Q2.

Как готовиться к заданию 27

Задание 27 проверяет не знание одной формулы, а умение довести обработку данных до ответа: прочитать файл, проверить данные, выбрать модель. Поэтому готовиться к нему стоит после того, как уверенно получаются задания на работу с файлами (17, 24, 26). Полезно:

  • решить демоверсию и 3–5 вариантов с разными K, R и признаками;
  • держать под рукой шаблон чтения файла и замены запятых, чтобы не тратить на это время на экзамене;
  • всегда вставлять в код самопроверку: число кластеров и разброс внутри каждого.

Если задания с файлами пока даются тяжело, посмотрите, как устроена подготовка к ЕГЭ по информатике в «Дельте». Мы разбираем Python с нуля и до заданий второй половины варианта.

Частые вопросы

Сколько баллов дают за задание 27 ЕГЭ по информатике?

Максимум 2 первичных балла. Это одно из самых дорогих заданий экзамена, в проекте спецификации ФИПИ ориентировочное время выполнения — 36 минут. Это рекомендация, а не отдельный таймер.

Можно ли решить задание 27 в Excel?

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

Чем задание 27 в 2027 году отличается от 2026 года?

По проекту демоверсии ФИПИ в 2027 году к заданию прилагается один файл, а ответ записывается одной строкой из двух чисел. В 2026 году нужно было обработать два файла и записать две строки ответа.

Как найти центр кластера в задании 27?

Центр — частица, у которой сумма модулей разностей энергий со всеми остальными частицами кластера минимальна. Для чисел на прямой это медиана: если отсортировать энергии кластера, центром будет средний элемент.

Бесплатное пробное занятие

Разберём ваш вариант вместе

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

Подобрать репетитора

Источники

← Все статьи