Задание выполняется с использованием прилагаемого файла.
Рассматриваются частицы на плоскости, обладающие следующими характеристиками:
декартовы координаты, вектор скорости, масса, а также признак, характеризующий
внутреннее строение частицы, обозначаемый числами от I до VII
(в римской системе счисления).
Учёный решил провести кластеризацию частиц по значениям их кинетической энергии,
то есть разбить их множество на K непересекающихся непустых подмножеств
(кластеров), таких, что модуль разности кинетических энергий любых двух частиц
каждого подмножества не превосходит значения R.
Гарантируется, что такое разбиение существует и единственно для заданного R.
Будем называть центром кластера такую его частицу, для которой сумма модулей
разности кинетических энергий со всеми остальными частицами этого кластера
минимальна. Для каждого кластера гарантируется единственность его центра.
В каждой строке текстового файла хранится информация об одной частице:
координаты x и y, проекции вектора скорости
Vx и Vy, масса m и признак.
Значения даны в одинаковых для всех частиц единицах измерения,
обозначения единиц измерения в файле не приводятся.
Значения в строке разделяются одним или несколькими пробелами и/или символами табуляции.
Количество строк в файле не превышает 10 000.
Абсолютная величина каждого числового значения не превышает 100,0.
Известно, что все описанные в файле частицы подразделяются ровно на 4 кластера
(K = 4) с R = 2,0 для каждого.
Для каждого кластера определите его центр, затем найдите два числа:
Q1 — наибольшее евклидово расстояние между частицами одного кластера, имеющими признак II, и
Q2 — максимальное значение кинетической энергии для центра кластера.
В ответе запишите два числа: сначала целую часть произведения
Q1 × 10 000,
затем целую часть произведения
Q2 × 10 000.
Для справки
Кинетическая энергия E частицы массы m, обладающей скоростью
V⃗ = (Vx; Vy),
вычисляется по формуле:
E = 1/2 · m(Vx2 + Vy2).
Евклидово расстояние между двумя точками на плоскости
A(x1, y1) и
B(x2, y2)
вычисляется по формуле:
d(A, B) =
√((x2 − x1)2 +
(y2 − y1)2).
Типовой пример организации данных во входном файле
Три строки файла для трёх частиц:
|
1 2 3 |
0,67 -2,14 3,0 -4,0 0,2 V 3,14 7,22 3,2 4,3 0,7 II 1,33 5,56 0,00 5,22 0,456 IV |
Для частицы из первой строки примера кинетическая энергия равна 2,5.
Типовой пример имеет иллюстративный характер.
Для выполнения задания используйте данные из прилагаемого файла.

Ответ:
Q1 × 10000 Q2 × 10000
Демонстрационный вариант ЕГЭ 2027 по информатике – задание №27
Решение:
Нужно разбить все частицы на 4 кластера по значениям кинетической энергии,
причём для любых двух частиц одного кластера модуль разности их кинетических энергий
не должен превышать R = 2.
После этого для каждого кластера нужно определить его центр, а затем найти:
Q1— наибольшее евклидово расстояние между частицами одного кластера, имеющими признакII;Q2— максимальное значение кинетической энергии центра кластера.
Используем следующий код:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
from math import sqrt R = 2.0 K = 4 data = [] with open('27.txt') as f: for line in f: x, y, vx, vy, m, t = line.split() x = float(x.replace(',', '.')) y = float(y.replace(',', '.')) vx = float(vx.replace(',', '.')) vy = float(vy.replace(',', '.')) m = float(m.replace(',', '.')) E = m * (vx ** 2 + vy ** 2) / 2 data.append([E, x, y, t]) # Сортируем частицы по кинетической энергии data.sort() clusters = [] start = 0 for i in range(1, len(data)): if data[i][0] - data[start][0] > R: clusters.append(data[start:i]) start = i clusters.append(data[start:]) # Находим центры кластеров centers = [] for cluster in clusters: best = None best_sum = float('inf') for p in cluster: s = 0 for q in cluster: s += abs(p[0] - q[0]) if s < best_sum: best_sum = s best = p centers.append(best) # Q1 — максимальное расстояние между частицами # с признаком II внутри одного кластера Q1 = 0 for cluster in clusters: a = [p for p in cluster if p[3] == 'II'] for i in range(len(a)): for j in range(i + 1, len(a)): d = sqrt( (a[i][1] - a[j][1]) ** 2 + (a[i][2] - a[j][2]) ** 2 ) Q1 = max(Q1, d) # Q2 — максимальная кинетическая энергия центра кластера Q2 = max(p[0] for p in centers) print(int(Q1 * 10000), int(Q2 * 10000)) |
Разбор программы
Сначала подключаем функцию sqrt() для вычисления квадратного корня:
|
1 |
from math import sqrt |
Задаём значение R = 2 и количество кластеров:
|
1 2 |
R = 2.0 K = 4 |
Затем считываем данные о каждой частице:
|
1 2 3 |
with open('27.txt') as f: for line in f: x, y, vx, vy, m, t = line.split() |
В каждой строке файла находятся:
координаты x и y,
проекции скорости vx и vy,
масса m и признак t.
Так как вещественные числа в файле записаны через запятую,
заменяем запятую на точку и преобразуем значения в тип float:
|
1 2 3 4 5 |
x = float(x.replace(',', '.')) y = float(y.replace(',', '.')) vx = float(vx.replace(',', '.')) vy = float(vy.replace(',', '.')) m = float(m.replace(',', '.')) |
Вычисление кинетической энергии
Кинетическая энергия вычисляется по формуле:
E = 1/2 · m · (vx² + vy²)
В программе:
|
1 |
E = m * (vx ** 2 + vy ** 2) / 2 |
Для каждой частицы сохраняем её энергию, координаты и признак:
|
1 |
data.append([E, x, y, t]) |
Разбиение на кластеры
Сначала сортируем все частицы по кинетической энергии:
|
1 |
data.sort() |
После сортировки частицы идут в порядке возрастания энергии.
Для каждого кластера сравниваем энергию текущей частицы
с энергией первой частицы этого кластера:
|
1 |
if data[i][0] - data[start][0] > R: |
Если разность становится больше 2,
то текущий кластер заканчивается и начинается новый:
|
1 2 |
clusters.append(data[start:i]) start = i |
Последний кластер добавляем после завершения цикла:
|
1 |
clusters.append(data[start:]) |
Поиск центра кластера
По условию центр кластера — это такая частица,
для которой сумма модулей разностей кинетических энергий
со всеми остальными частицами этого кластера минимальна.
Для каждой частицы p вычисляем эту сумму:
|
1 2 3 4 |
s = 0 for q in cluster: s += abs(p[0] - q[0]) |
Здесь p[0] и q[0] — кинетические энергии двух частиц.
Если полученная сумма меньше ранее найденной,
сохраняем эту частицу как лучший кандидат на центр:
|
1 2 3 |
if s < best_sum: best_sum = s best = p |
После перебора всех частиц сохраняем найденный центр:
|
1 |
centers.append(best) |
Вычисление Q1
Для каждого кластера выбираем только частицы с признаком II:
|
1 |
a = [p for p in cluster if p[3] == 'II'] |
После этого перебираем все пары таких частиц:
|
1 2 |
for i in range(len(a)): for j in range(i + 1, len(a)): |
Для каждой пары вычисляем евклидово расстояние:
|
1 2 3 4 |
d = sqrt( (a[i][1] - a[j][1]) ** 2 + (a[i][2] - a[j][2]) ** 2 ) |
Это соответствует формуле:
d = √((x2 - x1)² + (y2 - y1)²)
Сохраняем максимальное найденное расстояние:
|
1 |
Q1 = max(Q1, d) |
Вычисление Q2
В списке centers уже находятся центры всех кластеров.
Кинетическая энергия каждой частицы хранится в элементе с индексом 0.
Поэтому максимальную энергию центра кластера находим так:
|
1 |
Q2 = max(p[0] for p in centers) |
Формирование ответа
По условию требуется умножить значения Q1 и Q2
на 10000 и взять целую часть:
|
1 |
print(int(Q1 * 10000), int(Q2 * 10000)) |
Идея решения
Сначала для каждой частицы вычисляется кинетическая энергия.
Затем частицы сортируются по энергии и разбиваются на 4 кластера так,
чтобы разность максимальной и минимальной энергии внутри одного кластера
не превышала 2.
После этого в каждом кластере находится его центр.
Далее вычисляется максимальное расстояние между частицами с признаком II
внутри одного кластера и максимальная кинетическая энергия среди центров кластеров.
Ответ:
539936 100704