Задание №27 ЕГЭ по информатике: разбор, шаблоны кода Python и анти-примеры | СмартКИМ
СмартКИМ УДОБНАЯ ПОДГОТОВКА К ЕГЭ И ОГЭ
Задачи №27 Решать в тренажере Войти в СмартКИМ
ЕГЭ (1–27) ОГЭ (1–15) Python: шпаргалка
Быстрый переход по номерам и темам
Высокий (2 балла) Время: 15-25 мин Python 3 open('27A.txt') math.dist(p1, p2) Кластеризация по расстоянию Префиксные суммы Все задачи №{ topic_num } в каталоге

Задание №27. Анализ больших данных (Кластеризация / Префиксные суммы)

Тема: Кластеризация точек методом k-средних / DBSCAN, поиск центроидов кластеров и кольцевая автодорога
Финальное и самое престижное задание ЕГЭ (2 первичных балла). Состоит из двух файлов: Файл A (маленький, до 1 000 строк) и Файл B (огромный, до 100 000 строк). В актуальных вариантах 2024–2026 годов 95% задач — это кластеризация точек на плоскости и нахождение центроидов.

1. Что такое Центроид кластера:

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

  • КРИТИЧЕСКИ ВАЖНО: Центроид — это реальная точка из файла, а не среднее арифметическое координат!
  • Евклидово расстояние между точками $(x_1, y_1)$ и $(x_2, y_2)$: math.dist(p1, p2) или ((x1-x2)**2 + (y1-y2)**2)**0.5.

2. Пошаговый алгоритм решения (Кластеризация):

  1. Считываем координаты точек из файла, заменяя запятые на точки: coords = [float(x) for x in line.replace(',', '.').split()].
  2. Разделяем точки на кластеры (по координатным границам $x, y$ или по расстоянию $< R$).
  3. Для каждого кластера находим точку с минимальной суммой расстояний:
    def get_centroid(cluster):
        best_pt = None
        min_dist = float('inf')
        for p1 in cluster:
            d_sum = sum(math.dist(p1, p2) for p2 in cluster)
            if d_sum < min_dist:
                min_dist = d_sum
                best_pt = p1
        return best_pt
  4. Вычисляем координаты специальной точки $P$ (например, среднее арифметическое центроидов) и умножаем на 10 000 с отсечением дробной части: int(px * 10000), int(py * 10000).

Разновидности и прототипы задания на экзамене

Тип 1: Кластеризация точек на плоскости и нахождение центроидов (Хит 2024–2026)
Разделение точек на 2–3 кластера по координатным границам или расстоянию и нахождение центроида каждого кластера.
Тип 2: Кластеризация с шумовыми точками (DBSCAN)
Фильтрация изолированных точек-выбросов, у которых нет соседей в заданном радиусе R.
Тип 3: Кольцевая автодорога и биолаборатории (Префиксные суммы)
Кольцевой массив с подсчетом стоимости доставки биоматериалов за O(N) через префиксные суммы.
Тип 4: Поиск пар / троек с делимостью расстояния на K
Динамический массив остатков для поиска максимального произведения элементов.

Боевой шаблон решения на Python

Запустить код в онлайн-песочнице
# === Универсальный боевой шаблон Задания №27 (Кластеризация) ===
import math

# 1. Читаем точки из файла (27A.txt или 27B.txt):
points = []
with open('27_A.txt') as f:
    for line in f:
        parts = line.replace(',', '.').split()
        if len(parts) == 2:
            points.append((float(parts[0]), float(parts[1])))

# 2. Разделение на кластеры (пример для 2 кластеров по границе y = 3.0):
cluster1 = [p for p in points if p[1] > 3.0]
cluster2 = [p for p in points if p[1] <= 3.0]

# 3. Функция поиска реального центроида кластера:
def find_centroid(cluster):
    best_p = None
    min_sum = float('inf')
    for p1 in cluster:
        current_sum = sum(math.dist(p1, p2) for p2 in cluster)
        if current_sum < min_sum:
            min_sum = current_sum
            best_p = p1
    return best_p

c1 = find_centroid(cluster1)
c2 = find_centroid(cluster2)

print("Центроид кластера 1:", c1)
print("Центроид кластера 2:", c2)

# 4. Вычисление итогового ответа (Px * 10000, Py * 10000):
px = (c1[0] + c2[0]) / 2
py = (c1[1] + c2[1]) / 2
print("Ответ X:", int(px * 10000), "Ответ Y:", int(py * 10000))

Анти-примеры (Типичные ошибки vs Как делать правильно)

Как делать НЕ надо:
Ошибка: Взять среднее арифметическое координат вместо реального центроида
Центроид в ЕГЭ ОБЯЗАН быть одной из точек входного массива!
Как делать ПРАВИЛЬНО:
Правильно: Центроид находится только перебором точек кластера: min(sum(dist)).
Как делать НЕ надо:
Ошибка: Забыть заменить запятую на точку в float(line)
Файлы ЕГЭ часто содержат координаты с запятыми ('12,34 56,78') -> ValueError!
Как делать ПРАВИЛЬНО:
Правильно: Всегда делать line.replace(',', '.').split().
ГРОБ

ГРОБ №27: Кластеры сложной формы с шумовыми выбросами

В файле B присутствуют отдельные точки-выбросы между кластерами.

Как обойти ловушку: Фильтруйте изолированные точки: оставляйте только те точки, у которых в радиусе $R$ есть хотя бы $K$ соседей.

Лайфхаки и подводные камни на экзамене:

  • Функция `math.dist(p1, p2)` встроена в Python 3.8+ и работает быстрее ручного подсчета корня!
  • Для быстрого визуального разделения точек на кластеры посмотрите минимальные и максимальные X и Y в выборке.
Банк реальных задач №27 Открыть в тренажере СмартКИМ