Рассматриваются частицы на плоскости, обладающие следующими характеристиками: декартовы координаты, вектор скорости, масса, а также признак, характеризующий внутреннее строение частицы, обозначаемый числами от \(I\) до \(VII\) (в римской системе счисления).
Учёный решил провести кластеризацию частиц по значениям их кинетической энергии, то есть разбить их множество на \(K\) непересекающихся непустых подмножеств (кластеров), таких, что модуль разности кинетических энергий любых двух частиц каждого подмножества не превосходит значения \(R.\) Гарантируется, что такое разбиение существует и единственно для заданного \(R.\)
Будем называть центром кластера такую его частицу, для которой сумма модулей разности кинетических энергий со всеми остальными частицами этого кластера минимальна. Для каждого кластера гарантируется единственность его центра.
В каждой строке текстового файла хранится информация об одной частице: координаты \(x\) и \(y,\) проекции вектора скорости \(v_x\) и \(v_y,\) масса \(m\) и признак. Значения даны в одинаковых для всех частиц единицах измерения, обозначения единиц измерения в файле не приводятся. Значения в строке разделяются одним или несколькими пробелами и/или символами табуляции. Количество строк в файле не превышает \(10~000.\) Абсолютная величина каждого числового значения не превышает \(100{,}0.\)
Известно, что все описанные в файле частицы подразделяются ровно на \(4\) кластера \((K = 4)\) с \(R = 2{,}0\) для каждого.
Для каждого кластера определите его центр, затем найдите два числа: \(Q_1\) – наибольшее евклидово расстояние между частицами одного кластера, имеющими признак \(II,\) и \(Q_2\) – максимальное значение кинетической энергии для центра кластера.
В ответе запишите два числа: сначала целую часть произведения \(Q_1 \times 10~000,\) затем целую часть произведения \(Q_2 \times 10~000.\)
Для справки
Кинетическая энергия \(E\) частицы массы \(m,\) обладающей скоростью \(\vec{v}= (v_x; \, v_y)\) вычисляется по формуле: $$E = \frac{1}{2} m \left( v_x^2 + v_y^2 \right).$$ Евклидово расстояние между двумя точками на плоскости \(A(x_1, \, y_1)\) и \(B(x_2, \, y_2)\) вычисляется по формуле: $$d(A, \, B) = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$$
Типовой пример организации данных во входном файле
Три строки файла для трёх частиц:
| \(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.\)
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Решение:
Python
from math import dist
def kin_energy(pt):
x, y, vx, vy, m, p = pt
return m*(vx**2 + vy**2) / 2
def part_dist(p1, p2):
x1, y1, vx1, vy1, m1, p1 = p1
x2, y2, vx2, vy2, m2, p2 = p2
return dist((x1, y1), (x2, y2))
R = 0.5
K = 4
data = []
for line in open('demo_27.txt'):
x, y, vx, vy, m, p = line.replace(',', '.').split()
data.append([float(x), float(y), float(vx), float(vy), float(m), p])
clusters = []
while data:
clusters.append([data.pop()])
for part in clusters[-1]:
ek = kin_energy(part)
neigh = [pt for pt in data if abs(ek - kin_energy(pt)) <= R]
clusters[-1] += neigh
for pt in neigh:
data.remove(pt)
# print(len(clusters), [len(cl) for cl in clusters])
centers = []
for cl in clusters:
mkin = float('inf')
c = None
for pt in cl:
ek = kin_energy(pt)
kin = sum(abs(ek - kin_energy(p)) for p in cl)
if kin < mkin:
mkin = kin
c = pt
centers.append(c)
Q1 = 0
for cl in clusters:
tmp_cl = [pt for pt in cl if pt[-1] == 'II']
for i in range(len(tmp_cl) - 1):
for j in range(i + 1, len(tmp_cl)):
Q1 = max(Q1, part_dist(tmp_cl[i], tmp_cl[j]))
Q2 = max(kin_energy(p) for p in centers)
print(int(10_000 * Q1), int(10_000 * Q2))
Ответ: \(539936 \,\, 100704\)
Эффективно готовьтесь к ЕГЭ по информатике с новым тренажёром, эмулирующем работу станции КЕГЭ, которая используется на реальном экзамене