Перейти к содержимому

Задание 27 ЕГЭ по информатике 2027: кластеризация данных

Задание 27до 2 балловкластеризация данных
Раздел
Информационные технологии
Максимальный балл
2 балла
Уровень
высокий
Что проверяет
Умение выполнять последовательность решения задач анализа данных: сбор первичных данных, очистка и оценка качества данных, выбор и построение модели, преобразование данных, визуализация данных, интерпретация результатов
Что нужно сделать
Написать программу: в файле — координаты точек, разбить их на кластеры, найти центры и вычислить два числа.
Как записать ответ
два числа в две клетки таблицы ответа, в порядке из условия
Время
Около 36 минут по обобщённому плану ФИПИ
Элемент кодификатора
4.1
Компьютер
Нужна программа или электронная таблица: на станции КЕГЭ — среды программирования на C#, C++, Pascal, Java, Python и редактор таблиц
Файл к заданию
текстовый файл .txt — его читает программа
В 2026 году
Тоже задание 27

Задание 27 ЕГЭ по информатике 2027 года — последнее в работе. По обобщённому плану ФИПИ оно проверяет «умение выполнять последовательность решения задач анализа данных: сбор первичных данных, очистка и оценка качества данных, выбор и построение модели, преобразование данных, визуализация данных, интерпретация результатов». На экзамене это кластеризация: в текстовом файле лежат объекты с несколькими числовыми характеристиками, нужно разбить их на кластеры по одной вычисляемой величине, найти в каждом кластере центр и получить по ним два итоговых числа.

Файл текстовый, строк не больше 10 000: координаты, проекции скорости, масса и признак, поля разделены одним или несколькими пробелами и/или табуляциями, дробные значения записаны с десятичной запятой, модуль любого числа не превосходит 100,0. Уровень высокий: около 36 минут, 2 балла, нужна среда программирования. Изменение 2027 года касается записи ответа: «участнику экзамена нужно будет записать в ответе строку из двух чисел вместо двух строк по два числа».

Это одно из самых трудных заданий работы: средний процент выполнения в 2026 году — 11,5 %. Методические рекомендации ФИПИ по итогам года советуют «уделить особое внимание» в том числе «практическому программированию, включая работу с файлами при вводе/выводе данных».

Ниже — три типа задания с разбором и решением на Python: код можно запустить прямо на странице на приложенном файле из банка. Разбор демоверсии 2027 года и типичные ошибки — в конце, тренажёр с заданиями банка — сразу под этим текстом.

Тренажёр задания 27

Десять заданий номера 27 из банка тренажёра — с файлами, как на станции КЕГЭ. Решайте в песочнице Python прямо на странице или у себя; ответ проверяется по ключу, после проверки — верный ответ, разбор и решение на Python, а при ошибке — разбор от ИИ. Кнопка «Ещё 5 таких» у типа задания ниже даёт задания одного типа.

Загружаем задание…

Задание 27 вместе с остальными — в вариантах целиком.

Типы задания 27 с решением

Кластеризация частиц по кинетической энергии

Пример условия

В файле — частицы: координаты x и y, проекции скорости Vx и Vy, масса m и признак (римское число). Кластеризация идёт по кинетической энергии; разброс внутри кластера не больше R = 3,0, кластеров три. Найдите Q1 — наибольшее евклидово расстояние между частицами одного кластера с признаком VII, и Q2 — наибольшую энергию центра кластера.

0,0	0,0	1,0	0,0	2,0	VII
3,0	4,0	1,0	1,0	2,0	VII
-5,0	0,0	2,0	0,0	2,0	I
10,0	0,0	4,0	0,0	2,0	I
12,0	5,0	4,0	1,0	2,0	II
0,0	7,0	3,0	3,0	2,0	III
20,0	0,0	4,0	3,0	2,0	IV

Для этого примера ответ — 50000 250000.

Задание выполняется с использованием прилагаемого файла

27.txt50 КБ

1. Читаем строки: заменяем запятую на точку и делим строку методом split() без аргумента. 2. Для каждой частицы считаем кинетическую энергию E = 12m(Vx2 + Vy2). 3. Сортируем частицы по E и начинаем новый кластер там, где энергия больше энергии первой частицы текущего кластера более чем на R: внутри кластера разброс не превосходит R, поэтому разбиение единственно. 4. Центр кластера — частица с наименьшей суммой модулей |E − Ej| по своему кластеру. 5. Q2 — наибольшая энергия среди центров, Q1 — наибольшее расстояние между частицами одного кластера с признаком VII.

На примере: энергии равны 1, 2, 4, 16, 17, 18 и 25; при R = 3,0 выходят кластеры {1; 2; 4}, {16; 17; 18} и {25}, центры имеют энергии 2, 17 и 25, значит Q2 = 25 → 250000. Частицы признака VII стоят в точках (0; 0) и (3; 4), расстояние между ними 5 — это Q1 → 50000.

Решение на Python
import math

particles = []  # (x, y, энергия, признак)
with open('27.txt', encoding='utf-8') as f:
    for line in f:
        if not line.split():
            continue
        # в файле десятичный разделитель — запятая
        x, y, vx, vy, m, kind = line.replace(',', '.').split()
        x, y, vx, vy, m = float(x), float(y), float(vx), float(vy), float(m)
        energy = 0.5 * m * (vx * vx + vy * vy)  # кинетическая энергия
        particles.append((x, y, energy, kind))

R = 3.0
order = sorted(particles, key=lambda p: p[2])
clusters = []
start = 0
for i in range(1, len(order) + 1):
    # новый кластер — там, где энергия больше энергии первой частицы кластера более чем на R
    if i == len(order) or order[i][2] - order[start][2] > R:
        clusters.append(order[start:i])
        start = i

q1 = 0.0  # наибольшее расстояние между частицами признака VII
q2 = 0.0  # наибольшая энергия среди центров кластеров
for cl in clusters:
    # центр — частица с наименьшей суммой модулей разностей энергий
    center = min(cl, key=lambda p: sum(abs(p[2] - q[2]) for q in cl))
    q2 = max(q2, center[2])
    marked = [p for p in cl if p[3] == 'VII']
    for a in range(len(marked)):
        for b in range(a + 1, len(marked)):
            q1 = max(q1, math.hypot(marked[a][0] - marked[b][0], marked[a][1] - marked[b][1]))

print(int(q1 * 10000 + 1e-9), int(q2 * 10000 + 1e-9))

Ответ на приложенном файле: 517373 187098

Кластеризация частиц по скорости

Пример условия

В файле — частицы в том же формате. Кластеризация идёт по модулю вектора скорости; разброс внутри кластера не больше R = 1,0, кластеров три. Найдите Q1 — наибольшее расстояние от центра кластера до частицы этого же кластера с признаком I, и Q2 — наибольшую скорость центра кластера.

0,0	0,0	1,0	0,0	1,0	I
3,0	4,0	1,5	0,0	1,0	V
0,0	10,0	2,0	0,0	1,0	V
-5,0	0,0	3,0	4,0	1,0	VI
7,0	0,0	5,5	0,0	1,0	VII
0,0	-6,0	6,0	0,0	1,0	III
9,0	0,0	9,0	0,0	1,0	II

Для этого примера ответ — 50000 90000.

Задание выполняется с использованием прилагаемого файла

27.txt68 КБ

1. Характеристика кластеризации — скорость, то есть модуль вектора скорости: |V| = √Vx2 + Vy2. Координаты и масса здесь не нужны. 2. Сортируем частицы по скорости и режем список там, где скорость больше скорости первой частицы кластера более чем на R = 1,0. 3. Центр кластера — частица с наименьшей суммой модулей разностей скоростей со всеми частицами кластера, то есть медиана по скорости. 4. Q2 — наибольшая скорость среди центров. Q1 — наибольшее расстояние от центра кластера до частицы того же кластера с признаком I; расстояние считаем по координатам.

На примере: скорости равны 1; 1,5; 2; 5; 5,5; 6 и 9, при R = 1,0 это кластеры {1; 1,5; 2}, {5; 5,5; 6} и {9}. Центры — частицы со скоростями 1,5; 5,5 и 9, наибольшая даёт Q2 = 9 → 90000. Частица признака I одна, она в первом кластере в точке (0; 0), а центр кластера стоит в (3; 4): расстояние 5 — это Q1 → 50000.

Решение на Python
import math

particles = []  # (x, y, скорость, признак)
with open('27.txt', encoding='utf-8') as f:
    for line in f:
        if not line.split():
            continue
        # в файле десятичный разделитель — запятая
        x, y, vx, vy, m, kind = line.replace(',', '.').split()
        x, y, vx, vy, m = float(x), float(y), float(vx), float(vy), float(m)
        speed = math.hypot(vx, vy)  # модуль вектора скорости
        particles.append((x, y, speed, kind))

R = 1.0
order = sorted(particles, key=lambda p: p[2])
clusters = []
start = 0
for i in range(1, len(order) + 1):
    # новый кластер — там, где скорость больше скорости первой частицы кластера более чем на R
    if i == len(order) or order[i][2] - order[start][2] > R:
        clusters.append(order[start:i])
        start = i

q1 = 0.0  # наибольшее расстояние от центра до частицы нужного признака
q2 = 0.0  # наибольшая скорость среди центров
for cl in clusters:
    # центр — частица с наименьшей суммой модулей разностей скоростей
    center = min(cl, key=lambda p: sum(abs(p[2] - q[2]) for q in cl))
    q2 = max(q2, center[2])
    for p in cl:
        if p[3] == 'I':
            q1 = max(q1, math.hypot(center[0] - p[0], center[1] - p[1]))

print(int(q1 * 10000 + 1e-9), int(q2 * 10000 + 1e-9))

Ответ на приложенном файле: 449252 137191

Кластеризация частиц по расстоянию до начала координат

Пример условия

В файле — частицы в том же формате. Кластеризация идёт по расстоянию от начала координат; разброс внутри кластера не больше R = 3,0, кластеров три. Найдите Q1 — наибольшее евклидово расстояние между частицами одного кластера с признаком V, и Q2 — наибольшее расстояние от начала координат для центра кластера.

0,0	1,0	1,0	0,0	1,0	V
2,0	2,0	1,0	1,0	1,0	III
0,0	4,0	2,0	0,0	1,0	V
10,0	0,0	3,0	0,0	1,0	II
0,0	11,0	4,0	0,0	1,0	IV
12,0	0,0	5,0	0,0	1,0	I
20,0	0,0	6,0	0,0	1,0	VI

Для этого примера ответ — 30000 200000.

Задание выполняется с использованием прилагаемого файла

27.txt75 КБ

1. Характеристика кластеризации — расстояние от начала координат: d = √x2 + y2. Из строки нужны только x и y. 2. Сортируем частицы по d и режем список там, где d больше d первой частицы кластера более чем на R = 3,0. 3. Центр кластера — частица с наименьшей суммой модулей разностей d со всеми частицами кластера; наибольшее d среди центров даёт Q2. 4. Q1 — наибольшее расстояние между частицами одного кластера, имеющими признак V; пары перебираем внутри каждого кластера отдельно.

На примере: расстояния равны 1; 2,83; 4; 10; 11; 12 и 20, при R = 3,0 это кластеры {1; 2,83; 4}, {10; 11; 12} и {20}. Центры — частицы с d = 2,83; 11 и 20, наибольшее даёт Q2 = 20 → 200000. Частицы признака V стоят в первом кластере в точках (0; 1) и (0; 4), расстояние между ними 3 — это Q1 → 30000.

Решение на Python
import math

particles = []  # (x, y, расстояние от начала координат, признак)
with open('27.txt', encoding='utf-8') as f:
    for line in f:
        if not line.split():
            continue
        # в файле десятичный разделитель — запятая
        x, y, vx, vy, m, kind = line.replace(',', '.').split()
        x, y, vx, vy, m = float(x), float(y), float(vx), float(vy), float(m)
        dist = math.hypot(x, y)  # расстояние от начала координат
        particles.append((x, y, dist, kind))

R = 3.0
order = sorted(particles, key=lambda p: p[2])
clusters = []
start = 0
for i in range(1, len(order) + 1):
    # новый кластер — там, где расстояние больше расстояния первой частицы кластера более чем на R
    if i == len(order) or order[i][2] - order[start][2] > R:
        clusters.append(order[start:i])
        start = i

q1 = 0.0  # наибольшее расстояние между частицами нужного признака
q2 = 0.0  # наибольшее расстояние от начала координат среди центров
for cl in clusters:
    # центр — частица с наименьшей суммой модулей разностей расстояний
    center = min(cl, key=lambda p: sum(abs(p[2] - q[2]) for q in cl))
    q2 = max(q2, center[2])
    marked = [p for p in cl if p[3] == 'V']
    for a in range(len(marked)):
        for b in range(a + 1, len(marked)):
            q1 = max(q1, math.hypot(marked[a][0] - marked[b][0], marked[a][1] - marked[b][1]))

print(int(q1 * 10000 + 1e-9), int(q2 * 10000 + 1e-9))

Ответ на приложенном файле: 560711 275177

Шаблон кода на Python

Кластеры точек и их центры

Точки делятся на кластеры обходом: в один кластер попадают точки ближе порога друг к другу. Центр — точка с наименьшей суммой расстояний до остальных точек кластера.

Python
from math import dist

with open('27.txt') as f:
    points = [tuple(map(float, line.replace(',', '.').split()))
              for line in f if line.split()]

# обход: соседи ближе порога — в одном кластере
clusters, left = [], set(range(len(points)))
while left:
    stack = [left.pop()]
    cluster = []
    while stack:
        i = stack.pop()
        cluster.append(points[i])
        near = [j for j in left if dist(points[i], points[j]) < 2]
        left -= set(near)
        stack += near
    clusters.append(cluster)

centers = [min(c, key=lambda p: sum(dist(p, q) for q in c)) for c in clusters]
px = sum(c[0] for c in centers) / len(centers)
py = sum(c[1] for c in centers) / len(centers)
print(int(px * 10000), int(py * 10000))
Файл-пример 27.txt
1,0 1,0
1,5 1,2
0,8 1,9
6,0 6,2
6,4 5,8
5,7 6,6
6,1 6,0
Вывод на файле-примере
35000 36000

Шаблоны кода ко всем заданиям

Как выполнять задание

  1. Сохраните файл задания в рабочую папку и откройте его по имени: open('27.txt', encoding='utf-8'); пустые строки пропускайте.
  2. Разбирайте строку через line.replace(',', '.').split(): split() без аргумента убирает любое число пробелов и табуляций, а замена запятой нужна из-за десятичной запятой в файле.
  3. Возьмите из условия формулу характеристики и порог R: кинетическая энергия, модуль скорости или расстояние от начала координат.
  4. Отсортируйте объекты по характеристике и начинайте новый кластер там, где очередное значение больше значения первой частицы текущего кластера более чем на R.
  5. В каждом кластере найдите центр — частицу с наименьшей суммой модулей разностей характеристики со всеми частицами кластера; это не среднее арифметическое.
  6. Посчитайте Q1 и Q2. В типовом примере условия названо значение характеристики только для одной частицы (кинетическая энергия, скорость или расстояние) — убедитесь, что ваша формула даёт именно это число, прежде чем запускать программу на файле банка.
  7. В ответ идут два числа в одной строке: сначала Q1, затем Q2 — целые части произведений на 10 000, без округления.

Что нужно знать

  • Характеристика кластеризации. Берётся из условия: кинетическая энергия 12m(Vx2 + Vy2), модуль скорости √Vx2 + Vy2 или расстояние от начала координат √x2 + y2.
  • Порог R. Внутри кластера характеристика различается не больше чем на R, поэтому в отсортированном списке новый кластер начинается там, где очередное значение больше значения первой частицы кластера более чем на R.
  • Центр. Сумма |E − Ei| по кластеру минимальна у медианы, поэтому центр — одна из частиц кластера, а не средняя величина.
  • Q1 и Q2. Q1 — максимум евклидова расстояния по парам частиц нужного признака внутри одного кластера, Q2 — максимум характеристики среди центров.
  • Ответ. Два целых числа в одной строке: целые части произведений на 10 000, в порядке из условия.

Разобрать задание целиком можно в демоверсии КЕГЭ 2027 на сайте — с файлом и песочницей Python.

Как оценивается

Проверка автоматическая, по ключу: ответ должен быть записан в форме из условия и полностью совпасть с эталоном. Код и черновики не проверяют — значение имеет только ответ. За верный ответ — 2 балла. 1 балл ставят, если верные числа перепутаны местами или на своём месте стоит только одно верное число.

Критерии всех заданий экзамена — на странице критериев ЕГЭ.

Разбор задания демоверсии 2027

В демоверсии 2027 года кластеризация идёт по кинетической энергии E = 12m(Vx2 + Vy2), кластеров четыре, R = 2,0; Q1 — наибольшее расстояние между частицами одного кластера с признаком II, Q2 — максимальная энергия центра. В файле demo_27.txt 2 604 строки.

Типовой пример условия — три частицы. Для первой строки (x = 0,67, y = −2,14, Vx = 3,0, Vy = −4,0, m = 0,2, признак V): E = 0,5 × 0,2 × (3,02 + 4,02) = 0,5 × 0,2 × 25 = 2,5 — сходится с числом, названным в условии. Ответ по трём частицам не формируется: пример «имеет иллюстративный характер».

На файле демоверсии та же программа из первого типа с тремя изменениями — имя файла demo_27.txt, порог R = 2,0 и признак II — печатает 539936 100704, это ключ ФИПИ. Разбиение здесь идёт по разрывам в отсортированном по энергии списке, и сравнивать надо не с соседней частицей, а с первой частицей текущего кластера: иначе кластеры склеиваются и ответ расходится с ключом.

Типичные ошибки

Десятичная запятая попала в float()

В файле дробные значения записаны с запятой, поэтому float('2,98') падает с ValueError. Сначала приводят строку к обычному виду: line.replace(',', '.').split(). Это первая операция при чтении, и без неё программа не запускается вовсе.

Кластер режут по разрыву между соседями

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

Центр считают средним арифметическим

Центр — это частица кластера с наименьшей суммой модулей разностей характеристики со всеми остальными, то есть медиана. Среднее значение может не совпасть ни с одной частицей, и ответ тогда не сойдётся с ключом.

Q1 считают по всем частицам кластера

Расстояние берут только между частицами указанного признака (в демоверсии — признак II). Остальные частицы кластера в Q1 не участвуют, хотя их координаты лежат в том же файле и их легко перепутать при переборе пар.

Округление вместо целой части

Ответ — целая часть произведения на 10 000, то есть отсечение дробной части, а не округление: int(539936.7) и round(539936.7) дают разные числа. После умножения копится ошибка float, поэтому перед int() добавляют маленькую добавку.

Вопросы и ответы

Как решать задание 27 ЕГЭ по информатике?

Считать по формуле из условия характеристику каждой строки (энергию, скорость или расстояние от начала координат), отсортировать объекты по ней, разрезать список на кластеры по разрывам больше R, в каждом кластере найти центр, затем посчитать Q1 по частицам нужного признака и Q2 по центрам. Всё это укладывается в одну короткую программу.

Сколько баллов даёт задание 27 и сколько на него времени?

2 балла, причём возможен частичный балл: если числа в ячейках таблицы перепутаны местами или на верном месте стоит только одно верное число, ставится 1 балл. По обобщённому плану ФИПИ на задание отводится около 36 минут, уровень сложности — высокий.

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

Тематика осталась прежней, изменена только структура записи ответа: «участнику экзамена нужно будет записать в ответе строку из двух чисел вместо двух строк по два числа». В 2026 году ответ занимал две строки по два числа, потому что к заданию прилагались два файла с данными (А и Б) и для каждого требовалась своя пара чисел.

Можно ли решить задание 27 без программы?

Нет: в файле тысячи строк, вручную их не отсортировать и не перебрать пары. По обобщённому плану ФИПИ для задания требуется специализированное ПО, то есть среда программирования. Вручную разбирают только типовой пример из условия — чтобы проверить формулу характеристики.

В каком порядке записывать два числа в ответе?

В том порядке, в котором они названы в условии: сначала Q1, затем Q2, оба — целые части произведений на 10 000, через пробел в одной строке. Если числа перепутать местами, ответ считается частично верным.

Другие задания раздела «Информационные технологии»

По демоверсии, спецификации и кодификатору ФИПИ 2027
Обновлено:

Все задания ЕГЭ по информатике →