В лаборатории проводится эксперимент, состоящий из множества испытаний. Результат каждого испытания представляется в виде пары чисел.
Для визуализации результатов эта пара рассматривается как координаты точки на плоскости, и на чертеже отмечаются точки, соответствующие всем испытаниям.
По результатам эксперимента проводится кластеризация полученных результатов: на плоскости выделяется несколько кластеров — кругов радиуса не более 3 единиц так, что каждая точка попадает ровно в один кластер.
Центром кластера считается та из входящих в него точек, для которой минимально среднее из расстояний до всех остальных точек кластера.
При этом расстояние вычисляется по стандартной формуле расстояния между точками на евклидовой плоскости.
Радиусом кластера считается максимальное из расстояний от центра до остальных точек кластера.
Обработка результатов эксперимента включает следующие шаги:
1) кластер, содержащий наибольшее число точек, исключается;
2) определяются центры и радиусы всех оставшихся кластеров;
3) вычисляется средний радиус оставшихся кластеров.
В файле записан протокол проведения эксперимента. Каждая строка файла содержит два числа: координаты X и Y точки, соответствующей одному испытанию. По данному протоколу надо определить средний радиус всех кластеров за исключением содержащего наибольшее число точек.
Файл A
Файл B
Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. По данным каждого из представленных файлов определите средний радиус по описанным выше правилам.
В ответе запишите два числа: сначала средний радиус для файла A, затем для файла B.
В качестве значения указывайте целую часть от умножения найденного числового значения на 10 000.
Ответ:
Для визуализации результатов эта пара рассматривается как координаты точки на плоскости, и на чертеже отмечаются точки, соответствующие всем испытаниям.
По результатам эксперимента проводится кластеризация полученных результатов: на плоскости выделяется несколько кластеров — кругов радиуса не более 3 единиц так, что каждая точка попадает ровно в один кластер.
Центром кластера считается та из входящих в него точек, для которой минимально среднее из расстояний до всех остальных точек кластера.
При этом расстояние вычисляется по стандартной формуле расстояния между точками на евклидовой плоскости.
Радиусом кластера считается максимальное из расстояний от центра до остальных точек кластера.
Обработка результатов эксперимента включает следующие шаги:
1) кластер, содержащий наибольшее число точек, исключается;
2) определяются центры и радиусы всех оставшихся кластеров;
3) вычисляется средний радиус оставшихся кластеров.
В файле записан протокол проведения эксперимента. Каждая строка файла содержит два числа: координаты X и Y точки, соответствующей одному испытанию. По данному протоколу надо определить средний радиус всех кластеров за исключением содержащего наибольшее число точек.
Файл A
Файл B
Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. По данным каждого из представленных файлов определите средний радиус по описанным выше правилам.
В ответе запишите два числа: сначала средний радиус для файла A, затем для файла B.
В качестве значения указывайте целую часть от умножения найденного числового значения на 10 000.
Ответ:
💡 Пошаговый разбор и решение:
Построим диаграммы для файла А и Б. Для этого воспользуемся табличным редактором.
Диаграмма для файла А:
[рис.]
Диаграмма для файла Б:
[рис.]
Приведём решение на языке Python для файла А.
import math
def dist(p1, p2):
x1, y1 = p1
x2, y2 = p2
return ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5
def center_of_cluster(kl):
# Возвращает центр кластера: точку с минимальной суммой расстояний до остальных
if not kl:
return None
if len(kl) == 1:
return kl[0]
best_center = None
best_sum_dist = float('inf')
for p in kl:
s = sum(dist(p, q) for q in kl)
if s = 2:
x = float(parts[0])
y = float(parts[1])
pts.append((x, y))
except FileNotFoundError:
pass
return pts
def compute_mean_radius_for_file(filename):
pts = load_points_from_file(filename)
return mean_radius_after_exclusion(pts)
file_A = "27A.txt"
mean_A = compute_mean_radius_for_file(file_A)
out_A = int(math.floor(mean_A * 10000.0 + 1e-12))
print(out_A)
Приведём решение на языке Python для файла B.
import math
def dist(p1, p2):
x1, y1 = p1
x2, y2 = p2
return ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5
def center_of_cluster(kl):
# Возвращает центр кластера: точку с минимальной суммой расстояний до остальных
if not kl:
return None
if len(kl) == 1:
return kl[0]
best_center = None
best_sum_dist = float('inf')
for p in kl:
s = sum(dist(p, q) for q in kl)
if s 4 and y >6:
clusters[1].append((x,y))
elif y > 5:
clusters[2].append((x,y))
elif x > 2:
clusters[3].append((x,y))
else:
clusters[4].append((x,y))
# 2) исключаем кластер с наибольшим количеством точек
if clusters:
largest = max(clusters, key=len)
clusters.remove(largest)
# Если после исключения кластеров не осталось
remaining_clusters = [kl for kl in clusters if kl]
if not remaining_clusters:
return 0.0
centers = [center_of_cluster(kl) for kl in remaining_clusters]
radii = [radius_of_cluster(c, kl) for c, kl in zip(centers, remaining_clusters)]
avg_radius = sum(radii) / len(radii) if radii else 0.0
return avg_radius
def load_points_from_file(filename):
pts = []
try:
with open(filename, 'r') as f:
for line in f:
line = line.strip()
if not line:
continue
# Разделяем по пробелам и берём первые две чисел
parts = line.split()
if len(parts) >= 2:
x = float(parts[0])
y = float(parts[1])
pts.append((x, y))
except FileNotFoundError:
pass
return pts
def compute_mean_radius_for_file(filename):
pts = load_points_from_file(filename)
return mean_radius_after_exclusion(pts)
file_B = "27B.txt"
mean_B = compute_mean_radius_for_file(file_B)
out_B = int(math.floor(mean_B * 10000.0 + 1e-12))
print(out_B)
Ответ: 9142; 11309.
Диаграмма для файла А:
[рис.]
Диаграмма для файла Б:
[рис.]
Приведём решение на языке Python для файла А.
import math
def dist(p1, p2):
x1, y1 = p1
x2, y2 = p2
return ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5
def center_of_cluster(kl):
# Возвращает центр кластера: точку с минимальной суммой расстояний до остальных
if not kl:
return None
if len(kl) == 1:
return kl[0]
best_center = None
best_sum_dist = float('inf')
for p in kl:
s = sum(dist(p, q) for q in kl)
if s = 2:
x = float(parts[0])
y = float(parts[1])
pts.append((x, y))
except FileNotFoundError:
pass
return pts
def compute_mean_radius_for_file(filename):
pts = load_points_from_file(filename)
return mean_radius_after_exclusion(pts)
file_A = "27A.txt"
mean_A = compute_mean_radius_for_file(file_A)
out_A = int(math.floor(mean_A * 10000.0 + 1e-12))
print(out_A)
Приведём решение на языке Python для файла B.
import math
def dist(p1, p2):
x1, y1 = p1
x2, y2 = p2
return ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5
def center_of_cluster(kl):
# Возвращает центр кластера: точку с минимальной суммой расстояний до остальных
if not kl:
return None
if len(kl) == 1:
return kl[0]
best_center = None
best_sum_dist = float('inf')
for p in kl:
s = sum(dist(p, q) for q in kl)
if s 4 and y >6:
clusters[1].append((x,y))
elif y > 5:
clusters[2].append((x,y))
elif x > 2:
clusters[3].append((x,y))
else:
clusters[4].append((x,y))
# 2) исключаем кластер с наибольшим количеством точек
if clusters:
largest = max(clusters, key=len)
clusters.remove(largest)
# Если после исключения кластеров не осталось
remaining_clusters = [kl for kl in clusters if kl]
if not remaining_clusters:
return 0.0
centers = [center_of_cluster(kl) for kl in remaining_clusters]
radii = [radius_of_cluster(c, kl) for c, kl in zip(centers, remaining_clusters)]
avg_radius = sum(radii) / len(radii) if radii else 0.0
return avg_radius
def load_points_from_file(filename):
pts = []
try:
with open(filename, 'r') as f:
for line in f:
line = line.strip()
if not line:
continue
# Разделяем по пробелам и берём первые две чисел
parts = line.split()
if len(parts) >= 2:
x = float(parts[0])
y = float(parts[1])
pts.append((x, y))
except FileNotFoundError:
pass
return pts
def compute_mean_radius_for_file(filename):
pts = load_points_from_file(filename)
return mean_radius_after_exclusion(pts)
file_B = "27B.txt"
mean_B = compute_mean_radius_for_file(file_B)
out_B = int(math.floor(mean_B * 10000.0 + 1e-12))
print(out_B)
Ответ: 9142; 11309.
Правильный ответ:
9142&11309
📚 Похожие разобранные задания по предмету:
ID 33001 • Задание №18
Дан квадрат 15 × 15 клеток, в каждой клетке которого записано целое число. В левом верхнем углу квадрата стоит...
ID 32501 • Задание №15
Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m».
Для ка...
🔗 Другие задания линии №27 по предмету Информатика:
ID 34669
Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой ...
ID 34670
Последовательность натуральных чисел характеризуется числом Х — наибольшим числом, кратным 14 ...
ID 34671
На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются ...
ID 34672
Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последо...
ID 34673
На вход программы поступает последовательность из N натуральных чисел. Рассматриваются все пары...