Пример 1
Учёный решил исследовать скопления звёзд. В файле записаны координаты звёзд (x, y) — по одной паре чисел в строке. Звёзды образуют два кластера. Центром кластера называется звезда, у которой сумма расстояний до остальных звёзд кластера минимальна.
Найдите среднее арифметическое абсцисс центров кластеров Px и среднее арифметическое их ординат Py. В ответе запишите целые части произведений Px · 10 000 и Py · 10 000.
Показать решение
1. Строим точечную диаграмму в электронной таблице и смотрим, как разделить точки на кластеры — например, прямой y = x или условием x < 5.
2. Для каждого кластера ищем звезду с минимальной суммой расстояний до остальных — перебором.
3. Усредняем координаты центров и умножаем на 10 000.
from math import dist # евклидово расстояние между двумя точками
pts = [tuple(map(float, line.replace(',', '.').split())) # читаем пары координат, запятую меняем на точку
for line in open('27.txt')] # по одной звезде в строке
cl = [[p for p in pts if p[1] > p[0]], # кластер выше прямой y = x (границу берём по диаграмме)
[p for p in pts if p[1] <= p[0]]] # кластер ниже прямой
def center(c): # центр кластера
return min(c, key=lambda p: sum(dist(p, q) for q in c)) # точка с минимальной суммой расстояний
cs = [center(c) for c in cl] # центры обоих кластеров
px = sum(c[0] for c in cs) / len(cs) # среднее абсцисс центров
py = sum(c[1] for c in cs) / len(cs) # среднее ординат центров
print(int(px * 10000), int(py * 10000)) # целые части, как требует условиеЕсли в файле есть строка заголовка, её нужно пропустить. Ответ зависит от файла с экзамена.
