Тема 27. Анализ данных

27.06 Поиск двойных/тройных звездных систем

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела анализ данных
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#105882Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Тройная звездная система – это система, в которой три звезды попарно находятся на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих трех звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах трех кластеров, где R = 0.45  , t = 0.02  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах четырех кластеров, где R = 0.45  , t = 0.01  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого в каждом кластере файла найдите тройную звезду, которая образует треугольник с наименьшим периметром. Затем вычислите два числа: Px  — среднее арифметическое абсцисс найденных звезд, и Py  – среднее арифметическое ординат найденных звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |P |⋅10000
  x  для файла А, затем |Py|⋅10000  для файла А, далее целую часть произведения |Px|⋅10000  для файла Б и |Py|⋅10000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.01. Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно трем – то есть только тройные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальное расстояние между звездами а затем расчитать среднее расстояние между всеми найденными парами.

Код программы

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                if dist(i, j) <= r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.45)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.02 # Для файла А
t = 0.01 # Для файла Б
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    tr_stars = [] # Список для тройных звездных систем
    mn_starsys = [] # Список для хранения звездной системы с максимальным расстоянием
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3: # Проверяем, состоит ли кластер из трех звезд
            # Проверяем является ли остроугольным треугольником
            d1 = dist(j[0], j[1])
            d2 = dist(j[0], j[2])
            d3 = dist(j[1], j[2])
            if (d1 <= t) and (d2 <= t) and (d3 <= t):
                tr_stars.append(j)
    mn_per = 100000000000 # Переменная для хранения максимального длины стороны
    for j in tr_stars: # Проходим по всем найденным тройным системам
                                                                                                  
                                                                                                  
        # Вычисляем периметр
        d1 = dist(j[0], j[1])
        d2 = dist(j[0], j[2])
        d3 = dist(j[1], j[2])
        if d1 + d2 + d3 < mn_per:
            mn_per = d1 + d2 + d3 # Обновляем максимальное расстояние
            mn_starsys = j # Сохраняем текущую звездную систему как систему с максимальным расстоянием
    ans.append(mn_starsys)

# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(abs(res_X / 9) * 10000))  # Для файла А
print(int(abs(res_Y / 9) * 10000))  # Для файла А

print(int(abs(res_X / 12) * 10000))  # Для файла Б
print(int(abs(res_Y / 12) * 10000))  # Для файла Б

Ответ: 3746 15629 58241 3102

Ошибка.
Попробуйте повторить позже

Задача 2#105883Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная звездная система – это две звезды на расстоянии менее t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах двух кластеров, где R = 0.5  , t = 0.05  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах четырех кластеров, где R = 0.5  , t = 0.03  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную звездную систему, состоящую из красного гиганта (масса от 5.3 до 10 солнечных масс) и желтого гиганта (масса от 2.5 до 5.0 солнечных масс) с максимальным расстоянием между ними. Затем вычислите два числа: P
 x  — среднее арифметическое абсцисс найденных звезд, и P
  y  – среднее арифметическое ординат найденных звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅1000  для файла А, затем |Py|⋅1000  для файла А, далее целую часть произведения |Px|⋅1000  для файла Б и |Py|⋅1000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.05 для файла А и менее 0.03 для файла Б. Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальное расстояние между звездами, а затем рассчитать среднее расстояние между всеми найденными парами.

Код программы

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.5)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.05 # для файла А
t = 0.03 # для файла Б
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    bin_stars = [] # Список для бинарных звездных систем
    mx_starsys = [] # Список для хранения звездной системы с максимальным расстоянием
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2: # Проверяем, состоит ли кластер из двух звезд
            # Проверяем состоит ли кластер из белого и голубого карликов
            if ((5.3 <= j[0][2] <= 10 and 2.5 <= j[1][2] <= 5) or (
                    5.3 <= j[1][2] <= 10 and 2.5 <= j[0][2] <= 5)):
                bin_stars.append(j)
    mx_dist = 0 # Переменная для хранения максимального расстояния
    for j in bin_stars: # Проходим по всем найденным бинарным системам
                                                                                                  
                                                                                                  
        x = [j[0][0], j[0][1]]
        y = [j[1][0], j[1][1]]
        # Вычисляем расстояние между звездами в бинарной системе
        if dist(x, y) > mx_dist:
            mx_dist = dist(x, y) # Обновляем максимальное расстояние
            mx_starsys = j # Сохраняем текущую звездную систему как систему с максимальным расстоянием
    ans.append(mx_starsys)

# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 4) * 1000))  # Для файла А
print(int(abs(res_Y / 4) * 1000))  # Для файла А

print(int(abs(res_X / 8) * 1000))  # Для файла Б
print(int(abs(res_Y / 8) * 1000))  # Для файла Б

Ответ: 1919 1721 11819 3943

Ошибка.
Попробуйте повторить позже

Задача 3#106030Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная звездная система – это две звезды на расстоянии менее t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах четырех кластеров, где R = 0.6  , t = 0.02  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах семи кластеров, где R = 0.4  , t = 0.01  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную звездную систему состоящую из белого карлика (масса от 0.5 до 1.3 солнечных масс) и голубого карлика (масса от 0.08 до 0.2 солнечных масс) с минимальным расстоянием между ними. Затем вычислите два числа: P
 x  — среднее арифметическое абсцисс найденных звезд, и P
  y  – среднее арифметическое ординат найденных звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅1000  для файла А, затем |Py|⋅1000  для файла А, далее целую часть произведения |Px|⋅1000  для файла Б и |Py|⋅1000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найдем списки звезд, расстояние между которыми менее 0.02 (или 0.01 для файла Б). Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы и эти пары состоят из белого и голубого карликов. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти минимальные расстояние между звездами, а затем рассчитать среднее расстояние между всеми найденными парами.

Код программы

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.6) # для файла А
cl = dbscan(a, 0.4) # для файла Б
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.02 # для файла А
t = 0.01 # для файла Б
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    bin_stars = [] # Список для бинарных звездных систем
    mn_starsys = [] # Список для хранения звездной системы с минимальным расстоянием
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2: # Проверяем, состоит ли кластер из двух звезд
            # Проверяем состоит ли кластер из белого и голубого карликов
            if ((0.5 <= j[0][2] <= 1.3 and 0.08 <= j[1][2] <= 0.2) or (
                    0.5 <= j[1][2] <= 1.3 and 0.08 <= j[0][2] <= 0.2)):
                bin_stars.append(j)
    mn_dist = 1000000000000 # Переменная для хранения минимального расстояния
                                                                                                  
                                                                                                  
    for j in bin_stars: # Проходим по всем найденным бинарным системам
        x = [j[0][0], j[0][1]]
        y = [j[1][0], j[1][1]]
        # Вычисляем расстояние между звездами в бинарной системе
        if dist(x, y) < mn_dist:
            mn_dist = dist(x, y) # Обновляем минимальное расстояние
            mn_starsys = j # Сохраняем текущую звездную систему как систему с минимальным расстоянием
    ans.append(mn_starsys)

# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 8) * 1000))  # Для файла А
print(int(abs(res_Y / 8) * 1000))  # Для файла А

print(int(abs(res_X / 14) * 1000))  # Для файла Б
print(int(abs(res_Y / 14) * 1000))  # Для файла Б

Ответ: 2402 1161 64 603

Ошибка.
Попробуйте повторить позже

Задача 4#106031Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Тройная звездная система – это система, в которой три звезды попарно находятся на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих трех звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах двух кластеров, где R = 0.65  , t = 0.01  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах трех кластеров, где R = 0.65  , t = 0.01  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите тройную систему, в которой три звезды системы представляют из себя остроугольный треугольник. Если таких звездных систем в кластере несколько, то выбрать стоит систему с наибольшим периметром треугольника. Затем вычислите два числа: Px  — среднее арифметическое абсцисс звезд, и P
 y  – среднее арифметическое ординат звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения Px ⋅10000  для файла А, затем Py ⋅10000  для файла А, далее целую часть произведения Px ⋅10000  для файла Б и Py ⋅10000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.01. Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно трем – то есть только тройные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальное расстояние между звездами а затем расчитать среднее расстояние между всеми найденными парами.

Код программы

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                if dist(i, j) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("24.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.65)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.01
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    tr_stars = [] # Список для тройных звездных систем
    mx_starsys = [] # Список для хранения звездной системы с максимальным расстоянием
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3: # Проверяем, состоит ли кластер из трех звезд
            d1 = dist(j[0], j[1])
            d2 = dist(j[0], j[2])
            d3 = dist(j[1], j[2])
            if (d1*d1 < d2*d2 + d3*d3) and (d2*d2 < d1*d1 + d3*d3) and (d3*d3 < d2*d2 + d1*d1) and d1 < t and d2 < t and d3 < t:
                tr_stars.append(j)
    mx_per = 0 # Переменная для хранения максимального длины стороны
    for j in tr_stars: # Проходим по всем найденным тройным системам
        # Вычисляем периметр
        d1 = dist(j[0], j[1])
                                                                                                  
                                                                                                  
        d2 = dist(j[0], j[2])
        d3 = dist(j[1], j[2])
        if d1 + d2 + d3 > mx_per:
            mx_per = d1 + d2 + d3 # Обновляем максимальное расстояние
            mx_starsys = j # Сохраняем текущую звездную систему как систему с максимальным расстоянием
    ans.append(mx_starsys)
# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(res_X / 6 * 10000))  # Для файла А
print(int(res_Y / 6 * 10000))  # Для файла А

print(int(res_X / 9 * 10000))  # Для файла Б
print(int(res_Y / 9 * 10000))  # Для файла Б

Ответ: 1126 7830 28802 36021

Ошибка.
Попробуйте повторить позже

Задача 5#106032Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная система – это два объекта на расстоянии менее t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

В файле A хранятся данные о звёздах трех кластеров, где R = 0.5  , t = 0.02  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . В случае, если масса представлена положительным числом, объект является звездой, если отрицательным - объект является нейтронной звездой либо черной дырой. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах четырех кластеров, где R = 0.5  , t = 0.01  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную систему состоящую из двух нейтронных звезд с максимальной разницей масс. Масса нейтронной звезды не превышает 2.7 солнечных (по модулю), дальше - черные дыры. Затем вычислите два числа: Px  — среднее арифметическое абсцисс найденных нейтронных звезд, и Py  – среднее арифметическое ординат найденных нейтронных звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅1000  для файла А, затем |Py|⋅1000  для файла А, далее целую часть произведения |Px|⋅1000  для файла Б и |Py|⋅1000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.02 (и 0.01 дляя файла Б). Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальную разницу между массами звезд а затем расчитать среднее расстояние между всеми найденными парами.

Код программы

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.5)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.02 # для А
t = 0.01 # для Б
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    bin_stars = [] # Список для бинарных звездных систем
    mx_starsys = [] # Список для хранения звездной системы с максимальной разницей масс
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2: # Проверяем, состоит ли кластер из двух звезд
            # Проверяем являются ли обе эти звезды нейтронными
            if -2.7 <= j[0][2] < 0 and -2.7 <= j[1][2] < 0:
                bin_stars.append(j)
    mx_mass = 0 # Переменная для хранения максимальной разницы масс
    for j in bin_stars: # Проходим по всем найденным бинарным системам
        # Вычисляем разницу между массами
                                                                                                  
                                                                                                  
        if abs(j[0][2]-j[1][2]) > mx_mass:
            mx_mass = abs(j[0][2]-j[1][2]) # Обновляем максимальную разницу
            mx_starsys = j # Сохраняем текущую звездную систему как систему с максимальной разницей
    ans.append(mx_starsys)

# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 6) * 1000))  # Для файла А
print(int(abs(res_Y / 6) * 1000))  # Для файла А

print(int(abs(res_X / 8) * 1000))  # Для файла Б
print(int(abs(res_Y / 8) * 1000))  # Для файла Б

Ответ: 386 2566 614 1627

Ошибка.
Попробуйте повторить позже

Задача 6#106033Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная система – это два объекта на расстоянии менее t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах четырех кластеров, где R = 0.5  , t = 0.01  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . В случае, если масса представлена положительным числом, объект является звездой, если отрицательным - объект является нейтронной звездой либо черной дырой. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах семи кластеров, где R = 0.5  , t = 0.01  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную систему состоящую из двух черных дыр с минимальной разницей масс. Масса нейтронной звезды не превышает 2.7 солнечных (по модулю), дальше - черные дыры. Затем вычислите два числа: Px  — среднее арифметическое абсцисс найденных черных дыр, и Py  – среднее арифметическое ординат найденных черных дыр.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅100  для файла А, затем |Py|⋅100  для файла А, далее целую часть произведения |Px|⋅100  для файла Б и |Py|⋅100  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.01. Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальное расстояние между звездами а затем расчитать среднее расстояние между всеми найденными парами.

Код программы

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.5)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.01
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    bin_stars = [] # Список для бинарных звездных систем
    mn_starsys = [] # Список для хранения звездной системы с минимальной разницей масс
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2: # Проверяем, состоит ли кластер из двух звезд
            # Проверяем являются ли обе эти звезды черными дырами
            if j[0][2] < -2.7 and j[1][2] < -2.7:
                bin_stars.append(j)
    mn_mass = 1000000000 # Переменная для хранения максимальной разницы масс
    for j in bin_stars: # Проходим по всем найденным бинарным системам
        # Вычисляем разницу между массами
        if abs(j[0][2]-j[1][2]) < mn_mass:
                                                                                                  
                                                                                                  
            mn_mass = abs(j[0][2]-j[1][2]) # Обновляем минимальную разницу
            mn_starsys = j # Сохраняем текущую звездную систему как систему с минимальной разницей
    ans.append(mn_starsys)

# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 8) * 100))  # Для файла А
print(int(abs(res_Y / 8) * 100))  # Для файла А

print(int(abs(res_X / 14) * 100))  # Для файла Б
print(int(abs(res_Y / 14) * 100))  # Для файла Б

Ответ: 84 168 244 18

Ошибка.
Попробуйте повторить позже

Задача 7#106464Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Тройная звездная система – это система, в которой три звезды попарно находятся на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих трех звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах четырёх кластеров, где R = 0.8  , t = 0.3  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также её масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 1000.

В файле Б хранятся данные о звёздах трёх кластеров, где R = 0.8  , t = 0.03  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звёздах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите тройную звездную систему, состоящую из красного карлика (масса от 0.08 до 0.6 солнечных масс), желтого карлика (масса от 0.8 до 1.2 солнечных масс) и звезды с любой массой с минимальным периметром треугольника. Затем вычислите два числа: P
  x  — среднее арифметическое абсцисс найденных звезд, и Py  – среднее арифметическое ординат найденных звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅100  для файла А, затем |Py|⋅100  для файла А, далее целую часть произведения |Px|⋅100  для файла Б и |Py|⋅100  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использовать функцию dbscan.

Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в 4 для файла А и 3 для файла Б найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.3 для файла А и 0.03 для файла Б.

В каждом кластере нужно оставить только те списки, в которых количество звезд равно трем – то есть только тройные звездные системы. Также нужно проверить по массе звезд, чтобы в тройке были красный и желтый карлики.

В конце остается дело за малым: для каждой звездной системы в каждом кластере найти систему с минимальным периметром, а затем рассчитать среднее расстояние между всеми найденными тройками.

Программа:

from math import *
def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) <= r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.8)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

# t = 0.3 # Для файла А
t = 0.03 # Для файла Б
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    tr_stars = [] # Список для тройных звездных систем
    mn_starsys = [] # Список для хранения звездной системы с минимальным периметром
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3: # Проверяем, состоит ли кластер из трех звезд
            # Проверяем есть ли в системе красный и желтый карлики
            if ((0.08 <= j[0][2] <= 0.6 or 0.08 <= j[1][2] <= 0.6 or 0.08 <= j[2][2] <= 0.6)
            and (0.8 <= j[0][2] <= 1.2 or 0.8 <= j[1][2] <= 1.2 or 0.8 <= j[2][2] <= 1.2)):
                tr_stars.append(j)
    mn_per = 1000000000000 # Переменная для хранения минимального периметра
    for j in tr_stars: # Проходим по всем найденным тройным системам
        x = [j[0][0], j[0][1]]
                                                                                                  
                                                                                                  
        y = [j[1][0], j[1][1]]
        z = [j[2][0], j[2][1]]
        # Вычисляем периметр
        d1 = dist(x, y)
        d2 = dist(x, z)
        d3 = dist(z, y)
        if (d1 + d2 + d3) < mn_per and d1 < t and d2 < t and d3 < t:
            mn_per = d1 + d2 + d3 # Обновляем минимальный периметр
            mn_starsys = j # Сохраняем текущую звездную систему
    ans.append(mn_starsys)

res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(abs(res_X / (4 * 3)) * 100))  # Для файла А
print(int(abs(res_Y / (4 * 3)) * 100))  # Для файла А

print(int(abs(res_X / (3 * 3)) * 100))  # Для файла Б
print(int(abs(res_Y / (3 * 3)) * 100))  # Для файла Б

Ответ: 164 1053 825 53

Ошибка.
Попробуйте повторить позже

Задача 8#106465Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная звездная система – это две звезды на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах пяти кластеров, где R = 0.9  , t = 0.2  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 1000.

В файле Б хранятся данные о звёздах четырёх кластеров, где R = 0.9  , t = 0.02  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную звездную систему, состоящую из красного карлика (масса от 0.08 до 0.6 солнечных масс) и желтого карлика (масса от 0.8 до 1.2 солнечных масс) с максимальным расстоянием между ними. Затем вычислите два числа: P
 x  – среднее арифметическое абсцисс найденных звезд, и P
 y  – среднее арифметическое ординат найденных звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅1000  для файла А, затем |Py|⋅1000  для файла А, далее целую часть произведения |Px|⋅1000  для файла Б и |Py|⋅1000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для разделения звезд на кластеры будем использовать функцию dbscan.

Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в пяти для файла А и четырех для файла Б найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.3 для файла А и 0.03 для файла Б.

В каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы. Также нужно проверить по массе звезд, чтобы в паре были красный и желтый карлики.

В конце остается дело за малым: для каждой звездной системы в каждом кластере найти пару с максимальным расстоянием между звездами, а затем рассчитать среднее расстояние между всеми найденными парами.

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Программа:

from math import *
def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) <= r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.9)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.2 # Для файла А
t = 0.02 # Для файла Б
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    bin_stars = [] # Список для двойных звездных систем
    mx_starsys = [] # Список для хранения звездной системы с максимальным расстоянием
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2: # Проверяем, состоит ли кластер из двух звезд
            # Проверяем есть ли в системе красный и желтый карлики
            if ((0.08 <= j[0][2] <= 0.6 and 0.8 <= j[1][2] <= 1.2)
            or (0.08 <= j[1][2] <= 0.6 and 0.8 <= j[0][2] <= 1.2)):
                bin_stars.append(j)
    mx_dist = 0 # Переменная для хранения максимального расстояния
    for j in bin_stars: # Проходим по всем найденным двойным системам
        x = [j[0][0], j[0][1]]
                                                                                                  
                                                                                                  
        y = [j[1][0], j[1][1]]
        # Вычисляем периметр
        if dist(x, y) > mx_dist:
            mx_dist = dist(x, y)  # Обновляем максимальное расстояние
            mx_starsys = j # Сохраняем текущую звездную систему
    ans.append(mx_starsys)

res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / (5 * 2)) * 1000))  # Для файла А
print(int(abs(res_Y / (5 * 2)) * 1000))  # Для файла А

print(int(abs(res_X / (4 * 2)) * 1000))  # Для файла Б
print(int(abs(res_Y / (4 * 2)) * 1000))  # Для файла Б

Ответ: 9521 5587 4083 2186

Ошибка.
Попробуйте повторить позже

Задача 9#106466Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная система – это два объекта на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах пяти кластеров, где R = 0.68  , t = 0.2  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . Значения даны в условных единицах, которые представлены вещественными числами. В случае, если масса представлена положительным числом, объект является звездой, если отрицательным – объект является нейтронной звездой либо черной дырой. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах четырёх кластеров, где R = 0.55  , t = 0.02  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную систему, состоящую из звезды и черной дыры с максимальной разницей масс. Масса нейтронной звезды не превышает 2.7 солнечных (по модулю), дальше - черные дыры. Затем вычислите два числа: Px  – среднее арифметическое абсцисс найденных небесных тел, и Py  – среднее арифметическое ординат, найденных небесных тел.

В ответе запишите четыре числа через пробел: сначала целую часть произведения Px ⋅100  для файла А, затем Py ⋅100  для файла А, далее целую часть произведения Px ⋅100  для файла Б и Py ⋅100  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использовать функцию dbscan.

Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в пяти для файла А и четырех для файла Б найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.2 для файла А и 0.02 для файла Б.

В каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы. Также нужно проверить по массе звезд, чтобы в паре была звезда и черная дыра.

В конце остается дело за малым: для каждой звездной системы в каждом кластере найти пару с максимальной разницей масс между телами, а затем рассчитать среднее расстояние между всеми найденными парами.

Программа:

from math import *

def dbscan(a, r):
    cl = []  # Инициализируем список для хранения кластеров
    while a:  # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]:  # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j)  # Добавляем ’j’ в текущий кластер
                    a.remove(j)  # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl


f = open("2.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.68)  # для файла А
cl = dbscan(a, 0.55)  # для файла Б
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.2  # для файла А
t = 0.02  # для файла Б
ans = []
for i in cl_total:  # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t)  # Применяем алгоритм DBSCAN
    bin_stars = []  # Список для бинарных систем
    mx_starsys = []  # Список для хранения системы небесных тел с максимальной разницей масс
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2:  # Проверяем, состоит ли кластер из двух тел
            # Проверяем, что в паре есть черная дыра и обычная звезда
            if (j[0][2] < -2.7 and j[1][2] > 0) or (j[1][2] < -2.7 and j[0][2] > 0):
                bin_stars.append(j)
    mx_mass = 0  # Переменная для хранения максимальной разницы масс
                                                                                                  
                                                                                                  
    for j in bin_stars:  # Проходим по всем найденным бинарным системам
    # Вычисляем разницу между массами
        if abs(abs(j[0][2]) - abs(j[1][2])) > mx_mass:
            mx_mass = abs(abs(j[0][2]) - abs(j[1][2]))  # Обновляем максимальную разницу
            mx_starsys = j  # Сохраняем текущую звездную систему как систему с максимальной разницей
    ans.append(mx_starsys)

# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(res_X / (5 * 2) * 100))  # Для файла А
print(int(res_Y / (5 * 2) * 100))  # Для файла А

print(int(res_X / (4 * 2) * 100))  # Для файла Б
print(int(res_Y / (4 * 2) * 100))  # Для файла Б

Ответ: 715 467 547 343

Ошибка.
Попробуйте повторить позже

Задача 10#106467Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Тройная звездная система – это система, в которой три звезды попарно находятся на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих трех звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах трёх кластеров, где R = 0.7  , t = 0.11  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . Значения даны в условных единицах, которые представлены вещественными числами. В случае, если масса представлена положительным числом, объект является звездой, если отрицательным – объект является нейтронной звездой либо черной дырой. Известно, что количество звёзд не превышает 3000.

В файле Б хранятся данные о звёздах шести кластеров, где R = 0.6  , t = 0.05  для каждого кластера. Известно, что количество звёзд не превышает 10 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите тройную систему, состоящую из нейтронной звезды, черной дыры и любого небесного тела с минимальной суммарной массой. Масса нейтронной звезды не превышает 2.7 солнечных (по модулю), дальше – черные дыры. Затем вычислите два числа: Px  – среднее арифметическое абсцисс найденных небесных тел, и Py  – среднее арифметическое ординат найденных небесных тел.

В ответе запишите четыре числа через пробел: сначала целую часть произведения Px ⋅500  для файла А, затем Py ⋅500  для файла А, далее целую часть произведения Px ⋅500  для файла Б и Py ⋅500  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использовать функцию dbscan.

Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в 3 для файла А и 6 для файла Б найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.11 для файла А и 0.05 для файла Б.

В каждом кластере нужно оставить только те списки, в которых количество звезд равно трем – то есть только тройные звездные системы. Так же нужно проверить по массе звезд, чтобы в тройке была нейтронная звезда и черная дыра.

В конце остается дело за малым: для каждой звездной системы в каждом кластере найти систему с минимальной суммарной массой, а затем расcчитать среднее расстояние между всеми найденными тройками.

Программа:

from math import *


def dbscan(a, r):
    cl = []  # Инициализируем список для хранения кластеров
    while a:  # Пока есть элементы в входном массиве ’a’
    # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]:  # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) <= r:
                    cl[-1].append(j)  # Добавляем ’j’ в текущий кластер
                    a.remove(j)  # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl


f = open("4_A__5wzaw.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.7)  # Для файла А
cl = dbscan(a, 0.6)  # Для файла Б
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.11  # Для файла А
t = 0.05  # Для файла Б
ans = []
for i in cl_total:  # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t)  # Применяем алгоритм DBSCAN
    tr_stars = []  # Список для тройных звездных систем
    mn_starsys = []  # Список для хранения звездной системы с минимальной суммарной массой
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3:  # Проверяем, состоит ли кластер из трех звезд
            # Проверяем есть ли в нейтронная звезда и черная дыра
            if ((0 > j[0][2] >= -2.7 or 0 > j[1][2] >= -2.7 or 0 > j[2][2] >= -2.7)
                    and (j[0][2] < -2.7 or j[1][2] < -2.7 or j[2][2] < -2.7)):
                                                                                                  
                                                                                                  
                tr_stars.append(j)
    mn_mass = 1000000000000  # Переменная для хранения минимальной суммарной массы
    for j in tr_stars:  # Проходим по всем найденным тройным системам
        x = [j[0][0], j[0][1]]
        y = [j[1][0], j[1][1]]
        z = [j[2][0], j[2][1]]
        # Вычисляем периметр
        d1 = dist(x, y)
        d2 = dist(x, z)
        d3 = dist(z, y)
        if (j[0][2] + j[1][2] + j[2][2]) < mn_mass and d1 < t and d2 < t and d3 < t:
            mn_mass = (j[0][2] + j[1][2] + j[2][2])  # Обновляем минимальную суммарную массу
            mn_starsys = j  # Сохраняем текущую звездную систему
    ans.append(mn_starsys)
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(res_X / (3 * 3) * 500))  # Для файла А
print(int(res_Y / (3 * 3) * 500))  # Для файла А

print(int(res_X / (6 * 3) * 500))  # Для файла Б
print(int(res_Y / (6 * 3) * 500))  # Для файла Б

Ответ: 642 3145 4186 3329

Ошибка.
Попробуйте повторить позже

Задача 11#107074Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная система – это два объекта на расстоянии менее t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах двух кластеров, где R = 0.6  , t = 0.02  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также ее масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . В случае, если масса представлена положительным числом, объект является звездой, если отрицательным - объект является нейтронной звездой либо черной дырой. Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 6000.

В файле Б хранятся данные о звёздах трех кластеров, где R = 0.6  , t = 0.03  для каждого кластера. Известно, что количество звёзд не превышает 16000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную систему состоящую из двух нейтронных звезд с максимальной разницей масс. Масса нейтронной звезды не превышает 2.7 солнечных (по модулю), дальше идут черные дыры. Затем вычислите два числа: Px  — среднее арифметическое абсцисс найденных нейтронных звезд, и Py  – среднее арифметическое их ординат.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |Px|⋅100  для файла А, затем |Py|⋅100  для файла А, далее целую часть произведения |Px|⋅100  для файла Б и |Py|⋅100  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.02 в А файле (менее 0.03 в Б файле). Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальную разницу масс между звездами, а затем расчитать среднее арифметическое их координат между всеми найденными звёздами.

Код программы

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("1_B.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.6)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)
t = 0.03 # Для файла Б
t = 0.02 # Для файла А
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    duo_stars = [] # Список для бинарных звездных систем
    mx_starsys = [] # Список для хранения звездной системы с максимальной разницей масс
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2: # Проверяем, состоит ли кластер из двух звезд
            # Проверяем являются ли обе эти звезды нейтронными звёздами
            if -2.7 < j[0][2] < 0 and -2.7 < j[1][2] < 0:
                duo_stars.append(j)
    mx_mass = 0 # Переменная для хранения максимальной разницы масс
    for j in duo_stars: # Проходим по всем найденным бинарным системам
        # Вычисляем разницу между массами
        if abs(j[0][2]-j[1][2]) > mx_mass:
                                                                                                  
                                                                                                  
            mx_mass = abs(j[0][2]-j[1][2]) # Обновляем максимальную разницу
            mx_starsys = j # Сохраняем текущую звездную систему как систему с максимальной разницей
    ans.append(mx_starsys)

# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 4) * 100))  # Для файла А
print(int(abs(res_Y / 4) * 100))  # Для файла А

print(int(abs(res_X / 6) * 100))  # Для файла Б
print(int(abs(res_Y / 6) * 100))  # Для файла Б

Ответ: 115 399 172 474

Ошибка.
Попробуйте повторить позже

Задача 12#107075Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Двойная звездная система – это система, в которой две звезды находятся на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих двух звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах пяти кластеров, где R = 0.4  , t = 0.03  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 10000.

В файле Б хранятся данные о звёздах четырех кластеров, где R = 0.65  , t = 0.009  для каждого кластера. Известно, что количество звёзд не превышает 20 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите двойную звездную систему с максимальным расстоянием между звездами. Затем вычислите два числа: Px  — среднее арифметическое абсцисс звезд, и Py  – среднее арифметическое ординат звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |P |⋅1000
  x  для файла А, затем |Py|⋅1000  для файла А, далее целую часть произведения |Px|⋅1000  для файла Б и |Py|⋅1000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.03 в А файле (менее 0.009 в Б файле). Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно двум – то есть только двойные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальное расстояние между звездами, а затем расчитать среднее арифметическое их координат между всеми найденными парами звёзд.

Код программы для А файла

from math import *
def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
    # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
        # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
            # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                if dist(i, j) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2_A.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.4)
cl_total = []
c = 0
for i in cl:
    if len(i) > 10:
        cl_total.append(i)
res = []
t = 0.03  # Устанавливаем радиус для алгоритма DBSCAN
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    bin_stars = []  # Список для бинарных звездных систем
    max_star_sys = []
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 2: # Проверяем, состоит ли кластер из двух звезд
            bin_stars.append(j)  # Добавляем бинарную систему в список
    mx_dist = 0  # Переменная для хранения максимального расстояния
    # Список для хранения звездной системы с максимальным расстоянием
    for j in bin_stars: # Проходим по всем найденным бинарным системам
    # Вычисляем расстояние между звездами в бинарной системе
        if dist(j[0], j[1]) > mx_dist:
            mx_dist = dist(j[0], j[1])  # Обновляем максимальное расстояние
            max_star_sys = j
    # Сохраняем текущую звездную систему как систему с максимальным расстоянием
                                                                                                  
                                                                                                  
    res.append(max_star_sys)

res_X = 0
res_Y = 0
for i in res:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 10) * 1000))
print(int(abs(res_Y / 10) * 1000))


Код программы для Б файла

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2_B.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.65)
cl_total = []

for i in cl:
    if len(i) > 20:
        cl_total.append(i)
ans = []
t = 0.009
for cluster in cl_total:
    clust = dbscan(cluster,t)
    duo_stars = []
    max_star_sys = []
    for star_sys in clust:
        if len(star_sys) == 2:
            duo_stars.append(star_sys)
    max_dist = 0
    for i in duo_stars:
        if dist(i[0],i[1]) > max_dist:
            max_dist = dist(i[0],i[1])
            max_star_sys = i
    ans.append(max_star_sys)
                                                                                                  
                                                                                                  
sum_X = 0
sum_Y = 0
for i in ans:
    sum_X += i[0][0] + i[1][0]
    sum_Y += i[0][1] + i[1][1]
print(int(abs(sum_X/8)*1000))
print(int(abs(sum_Y/8)*1000))


Ответ: 22172 12740 30488 29200

Ошибка.
Попробуйте повторить позже

Задача 13#108132Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Тройная звездная система – это система, в которой три звезды попарно находятся на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих трех звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах четырех кластеров, где R = 0.5  , t = 0.05  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x  , затем координата y  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 10000.

В файле Б хранятся данные о звёздах трех кластеров, где R = 0.6  , t = 0.01  для каждого кластера. Известно, что количество звёзд не превышает 20 000. Структура хранения информации о звездах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите тройную звездную систему с максмальным суммарным расстоянием между звездами. Затем вычислите два числа: Px  — среднее арифметическое абсцисс звезд, и Py  – среднее арифметическое ординат звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения |P |⋅1000
  x  для файла А, затем |Py|⋅1000  для файла А, далее целую часть произведения |Px|⋅1000  для файла Б и |Py|⋅1000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использоваться функцию dbscan. Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.02 в А файле (менее 0.01 в Б файле). Далее в каждом кластере нужно оставить только те списки, в которых количество звезд равно трем – то есть только тройные звездные системы. В конце остается дело за малым: для каждой звездной системы в каждом кластере найти максимальное расстояние между звездами, а затем расчитать среднее арифметическое их координат между всеми найденными тройками звёзд.

Код программы для А файла

from math import *
def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            for j in a[:]:
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) <= r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("1_A.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.5)  # Для файла А
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.05  # Для файла А
ans = []
for i in cl_total:  # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t)  # Применяем алгоритм DBSCAN
    tr_stars = []  # Список для тройных звездных систем
    mn_starsys = []  # Список для хранения звездной системы с минимальной суммарной массой
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3:  # Проверяем, состоит ли кластер из трех звезд
            tr_stars.append(j)
    mx_d = 0  # Переменная для хранения максимального суммарного расстояния
    for j in tr_stars:  # Проходим по всем найденным тройным системам
        x = [j[0][0], j[0][1]]
        y = [j[1][0], j[1][1]]
        z = [j[2][0], j[2][1]]
        d1 = dist(x, y)
        d2 = dist(x, z)
        d3 = dist(z, y)
        if d1 < t and d2 < t and d3 < t and (d1 + d2 + d3) > mx_d:
            mx_d = d1 + d2 + d3
                                                                                                  
                                                                                                  
            mn_starsys = j  # Сохраняем текущую звездную систему
    ans.append(mn_starsys)
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(abs(res_X / (4 * 3)) * 1000))  # Для файла А
print(int(abs(res_Y / (4 * 3)) * 1000))  # Для файла А

Код программы для Б файла

from math import *
def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            for j in a[:]:
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) <= r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("1_B.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.6)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.01
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    tr_stars = [] # Список для тройных звездных систем
    mn_starsys = [] # Список для хранения звездной системы с минимальной суммарной массой
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3: # Проверяем, состоит ли кластер из трех звезд
            tr_stars.append(j)
    mx_d = 0  # Переменная для хранения максимального суммарного расстояния
    for j in tr_stars: # Проходим по всем найденным тройным системам
        x = [j[0][0], j[0][1]]
        y = [j[1][0], j[1][1]]
        z = [j[2][0], j[2][1]]
        d1 = dist(x, y)
        d2 = dist(x, z)
        d3 = dist(z, y)
        if d1 < t and d2 < t and d3 < t and (d1 + d2 + d3) > mx_d:
            mx_d = d1 + d2 + d3
                                                                                                  
                                                                                                  
            mn_starsys = j # Сохраняем текущую звездную систему
    ans.append(mn_starsys)
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(abs(res_X / (3 * 3)) * 1000))  # Для файла Б
print(int(abs(res_Y / (3 * 3)) * 1000))  # Для файла Б

Ответ: 1319 2548 249 662

Ошибка.
Попробуйте повторить позже

Задача 14#108133Максимум баллов за задание: 2

Учёный решил провести кластеризацию некоторого множества звёзд по их расположению на карте звёздного неба. Кластер звёзд – это набор звёзд (точек) на графике, каждая из которых находится от хотя бы одной другой звезды на расстоянии не более R  условных единиц. Каждая звезда обязательно принадлежит только одному из кластеров.

Тройная звездная система – это система, в которой три звезды попарно находятся на расстоянии не более t  . При этом других звезд на расстоянии менее t  у этих трех звезд быть не должно.

Под расстоянием понимается расстояние Евклида между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости, которое вычисляется по формуле:

        ∘ --------------------
d(A, B) =  (x2 − x1)2 + (y2 − y1)2

Аномалиями назовём точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. При расчётах аномалии учитывать не нужно.

В файле A хранятся данные о звёздах трех кластеров, где R = 0.7  , t = 0.08  для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды, а также её масса (в солнечных массах): сначала координата x  , затем координата y  , затем масса m  . Значения даны в условных единицах, которые представлены вещественными числами. Известно, что количество звёзд не превышает 11000.

В файле Б хранятся данные о звёздах четырех кластеров, где R = 0.5  , t = 0.05  для каждого кластера. Известно, что количество звёзд не превышает 31000. Структура хранения информации о звёздах в файле Б аналогична файлу А.

Для каждого файла в каждом кластере найдите тройную звездную систему, состоящую из красного карлика (масса от 0.08 до 0.6 солнечных масс), желтого карлика (масса от 0.8 до 1.2 солнечных масс) и звезды с любой массой с максимальной площадью треугольника. Затем вычислите два числа: P
 x  — среднее арифметическое абсцисс найденных звезд, и Py  – среднее арифметическое ординат найденных звезд.

В ответе запишите четыре числа через пробел: сначала целую часть произведения Px ⋅1000  для файла А, затем Py ⋅1000  для файла А, далее целую часть произведения Px ⋅1000  для файла Б и Py ⋅1000  для файла Б.

Возможные данные одного из файлов иллюстрированы графиком.

Внимание! График приведён в иллюстративных целях для произвольных значений, не имеющих отношения к заданию. Для выполнения задания используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Для начала визуально оценим данные в условии кластеры. Для этого откроем предложенные файлы в Excel  , перейдем в раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла А имеет вид:

PIC

Диаграмма для файла Б имеет вид:

PIC

Для разделения звезд на кластеры будем использовать функцию dbscan.

Дальше основная идея решения будет заключаться в том, что мы будем проходить по каждой точке в 3 для файла А и 4 для файла Б найденных кластерах и с помощью того же метода dbscan для каждого кластера найти списки звезд, расстояние между которыми менее 0.08 для файла А и 0.05 для файла Б.

В каждом кластере нужно оставить только те списки, в которых количество звезд равно трем – то есть только тройные звездные системы. Также нужно проверить по массе звезд, чтобы в тройке были красный и желтый карлики.

В конце остается дело за малым: для каждой звездной системы в каждом кластере найти систему с максимальной площадью, а затем рассчитать среднее расстояние между всеми найденными тройками.

Программа для файла А:

from math import *
def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            for j in a[:]:
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) <= r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2_A.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.7) # Для файла А
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.08 # Для файла А
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    tr_stars = [] # Список для тройных звездных систем
    mn_starsys = [] # Список для хранения звездной системы с минимальной суммарной массой
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3: # Проверяем, состоит ли кластер из трех звезд
            if ((0.08 <= j[0][2] <= 0.6 or 0.08 <= j[1][2] <= 0.6 or 0.08 <= j[2][2] <= 0.6)
            and (0.8 <= j[0][2] <= 1.2 or 0.8 <= j[1][2] <= 1.2 or 0.8 <= j[2][2] <= 1.2)):
                tr_stars.append(j)
    mx_square = -100000
    for j in tr_stars: # Проходим по всем найденным тройным системам
        x = [j[0][0], j[0][1]]
        y = [j[1][0], j[1][1]]
        z = [j[2][0], j[2][1]]
        d1 = dist(x, y)
        d2 = dist(x, z)
        d3 = dist(z, y)
                                                                                                  
                                                                                                  
        half_per = (d1 + d2 + d3) / 2
        if (half_per * (half_per - d1) * (half_per - d2) * (half_per - d3)) ** 0.5 > mx_square and d1 < t and d2 < t and d3 < t:
            mx_square = (half_per * (half_per - d1) * (half_per - d2) * (half_per - d3)) ** 0.5 # Обновляем максимальную площадь
            mn_starsys = j # Сохраняем текущую звездную систему
    ans.append(mn_starsys)
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(res_X / (3 * 3) * 1000))  # Для файла А
print(int(res_Y / (3 * 3) * 1000))  # Для файла А

Программа для файла Б:

from math import *
def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            for j in a[:]:
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) <= r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2_B.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.5) # Для файла Б
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)

t = 0.05 # Для файла Б
ans = []
for i in cl_total: # Проходим по каждому элементу в списке cl_total
    found_star = dbscan(i, t) # Применяем алгоритм DBSCAN
    tr_stars = [] # Список для тройных звездных систем
    mn_starsys = [] # Список для хранения звездной системы с минимальной суммарной массой
    # Проходим по каждому кластеру, найденному алгоритмом DBSCAN
    for j in found_star:
        if len(j) == 3: # Проверяем, состоит ли кластер из трех звезд
            if ((0.08 <= j[0][2] <= 0.6 or 0.08 <= j[1][2] <= 0.6 or 0.08 <= j[2][2] <= 0.6)
            and (0.8 <= j[0][2] <= 1.2 or 0.8 <= j[1][2] <= 1.2 or 0.8 <= j[2][2] <= 1.2)):
                tr_stars.append(j)
    mx_square = -100000
    for j in tr_stars: # Проходим по всем найденным тройным системам
        x = [j[0][0], j[0][1]]
        y = [j[1][0], j[1][1]]
        z = [j[2][0], j[2][1]]
        d1 = dist(x, y)
        d2 = dist(x, z)
        d3 = dist(z, y)
                                                                                                  
                                                                                                  
        half_per = (d1 + d2 + d3) / 2
        if (half_per * (half_per - d1) * (half_per - d2) * (half_per - d3)) ** 0.5 > mx_square and d1 < t and d2 < t and d3 < t:
            mx_square = (half_per * (half_per - d1) * (half_per - d2) * (half_per - d3)) ** 0.5 # Обновляем максимальную площадь
            mn_starsys = j # Сохраняем текущую звездную систему
    ans.append(mn_starsys)
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0] + i[2][0])
    res_Y += (i[0][1] + i[1][1] + i[2][1])

print(int(res_X / (4 * 3) * 1000))  # Для файла Б
print(int(res_Y / (4 * 3) * 1000))  # Для файла Б

Ответ: 12021 16996 7240 19000

Ошибка.
Попробуйте повторить позже

Задача 15#108568Максимум баллов за задание: 2

Астроном решил исследовать звёздное небо в далёкой галактике, проведя кластеризацию звёзд по их расположению на карте. Кластер звёзд — это набор точек на графике, каждая из которых находится от хотя бы одной другой точки на расстоянии не более R  условных единиц. Каждая звезда принадлежит только одному кластеру.

Двойная система — это два объекта на расстоянии менее t  , при этом других звёзд на расстоянии менее t  у них быть не должно.

Расстояние между двумя точками A(x1,y1)  и B(x2,y2)  на плоскости вычисляется по формуле:

d(A, B) = ∘ (x-−-x-)2 +-(y-−-y-)2
            2   1      2   1

Аномалиями называют точки, находящиеся на расстоянии более одной условной единицы от точек кластеров. Аномалии в расчётах учитывать не нужно.

В файле A хранятся данные о звёздах двух кластеров, где R = 0.5  , t = 0.15  для каждого кластера. В каждой строке записаны координаты одной звезды и её масса (в солнечных массах): x  , y  , m  . Если масса положительная (m > 0  ), это обычная звезда, если отрицательная (m < 0  ), это нейтронная звезда или чёрная дыра. Значения — вещественные числа в условных единицах. Количество звёзд не превышает 1500.

В файле B хранятся данные о звёздах трёх кластеров, где R = 0.7  , t = 0.025  для каждого кластера. Количество звёзд не превышает 5500. Структура данных аналогична файлу A.

Для каждого файла в каждом кластере найдите двойную систему из двух нейтронных звёзд (− 2.5 < m < 0  ) с максимальной суммой масс по модулю. Затем вычислите два числа: Px  — среднее арифметическое абсцисс найденных звёзд, и Py  — среднее арифметическое их ординат.

В ответе запишите четыре числа через пробел: сначала целую часть |Px|⋅200  для файла A, затем |Py|⋅200  для A, далее |P |⋅200
  x  для файла B и |P  |⋅200
  y  для B.

Внимание! График приведён в иллюстративных целях для произвольных значений и не относится к заданию. Используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Оценим данные визуально, открыв файлы в Excel  и построив точечные диаграммы через раздел «Вставка → Диаграммы → Точечная».

Диаграмма для файла A:

PIC

Диаграмма для файла B:

PIC

Для кластеризации используем алгоритм DBSCAN с радиусом R  . Затем в каждом кластере применим DBSCAN с радиусом t  для поиска двойных систем. Оставим только пары из двух нейтронных звёзд (− 2.5 < m < 0  ) и выберем ту, где сумма масс по модулю минимальна. Вычислим средние Px  и Py  для всех найденных пар.

Код для файла A:

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("1_A.txt")
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.5)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)
t = 0.15
ans = []
for i in cl_total:
    found_star = dbscan(i, t)
    duo_stars = []
    mx_starsys = []
    for j in found_star:
        if len(j) == 2:
            if -2.5 < j[0][2] < 0 and -2.5 < j[1][2] < 0:
                duo_stars.append(j)
    mx_mass = 0
    for j in duo_stars:
        if abs(j[0][2] + j[1][2]) > mx_mass:
            mx_mass = abs(j[0][2] + j[1][2])
            mx_starsys = j
    ans.append(mx_starsys)
# Рассчитываем среднее значение
res_X = 0
                                                                                                  
                                                                                                  
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 4) * 200))
print(int(abs(res_Y / 4) * 200))

Код для файла B:

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("1_B.txt")
s = f.readline()
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.7)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)
t = 0.025
ans = []
for i in cl_total:
    found_star = dbscan(i, t)
    duo_stars = []
    mx_starsys = []
    for j in found_star:
        if len(j) == 2:
            if -2.5 < j[0][2] < 0 and -2.5 < j[1][2] < 0:
                duo_stars.append(j)
    mx_mass = 0
    for j in duo_stars:
        if abs(j[0][2] + j[1][2]) > mx_mass:
            mx_mass = abs(j[0][2] + j[1][2])
            mx_starsys = j
    ans.append(mx_starsys)
# Рассчитываем среднее значение
                                                                                                  
                                                                                                  
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 6) * 200))
print(int(abs(res_Y / 6) * 200))

Ответ: 1088 1308 410 1896

Ошибка.
Попробуйте повторить позже

Задача 16#108570Максимум баллов за задание: 2

Космический инженер решил изучить расположение звёзд для планирования орбитальных станций. Он провёл кластеризацию звёзд по их позициям на карте. Кластер звёзд — это набор точек, где каждая точка находится от хотя бы одной другой на расстоянии не более R  условных единиц. Каждая звезда принадлежит только одному кластеру.

Двойная система — это два объекта на расстоянии менее t  , без других звёзд на расстоянии менее t  .

Расстояние между точками A(x1,y1)  и B(x2,y2)  вычисляется как:

d(A, B) = ∘ (x-−-x-)2 +-(y-−-y-)2
            2   1      2   1

Аномалиями называют точки, удалённые более чем на одну условную единицу от кластеров. Их в расчётах не учитываем.

В файле A хранятся данные о звёздах трёх кластеров, где R = 0.8  , t = 0.1  для каждого кластера. В каждой строке: x  , y  , m  (масса в солнечных массах). Положительная масса (m > 0  ) — звезда, отрицательная (m < 0  ) — нейтронная звезда или чёрная дыра. Количество звёзд не превышает 1200.

В файле B хранятся данные о звёздах четырех кластеров, где R = 0.4  , t = 0.08  для каждого кластера. Количество звёзд не превышает 5200. Структура данных та же.

Для каждого файла в каждом кластере найдите двойную систему из двух нейтронных звёзд (− 2.7 < m < 0  ) с максимальным расстоянием между ними. Вычислите Px  — среднее арифметическое абсцисс, и Py  — среднее арифметическое ординат найденных звёзд.

В ответе запишите целые части четырех чисел через пробел: |Px |⋅150  для A, |Py|⋅150  для A, |Px|⋅150  для B, |Py|⋅150  для B.

Внимание! График приведён для иллюстрации и не связан с заданием. Используйте данные из прилагаемого файла.

PIC

Вложения к задаче
Показать ответ и решение

Визуализируем данные в Excel  , используя «Вставка → Диаграммы → Точечная», чтобы понять структуру кластеров.

Диаграмма для файла A:

PIC

Диаграмма для файла B:

PIC

Применяем DBSCAN с радиусом R  для выделения кластеров, затем с радиусом t  для поиска двойных систем. Фильтруем пары из нейтронных звёзд (− 2.7 < m < 0  ), выбираем ту, где расстояние максимально, и вычисляем Px  и Py  .

Код для файла A:

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2_A.txt")
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.8)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)
t = 0.1
ans = []
for i in cl_total:
    found_star = dbscan(i, t)
    duo_stars = []
    mx_starsys = []
    for j in found_star:
        if len(j) == 2:
            x = [j[0][0],j[0][1]]
            y = [j[1][0],j[1][1]]
            if -2.7 < j[0][2] < 0 and -2.7 < j[1][2] < 0:
                duo_stars.append([x,y])
    mx_dist = 0
    for j in duo_stars:
        if dist(j[0],j[1]) > mx_dist:
            mx_mass = dist(j[0],j[1])
            mx_starsys = j
    ans.append(mx_starsys)
                                                                                                  
                                                                                                  
# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 6) * 150))
print(int(abs(res_Y / 6) * 150))

Код для файла B:

from math import *

def dbscan(a, r):
    cl = [] # Инициализируем список для хранения кластеров
    while a: # Пока есть элементы в входном массиве ’a’
        # Создаем новый кластер и добавляем в него первый элемент из ’a’
        cl.append([a.pop(0)])
        for i in cl[-1]: # Проходим по элементам последнего кластера
            # Проверяем  каждый элемент ’j’ в оставшихся элементах ’a’
            for j in a[:]:
                # Если расстояние между ’i’ и ’j’ меньше радиуса ’r’
                x = [i[0], i[1]]
                y = [j[0], j[1]]
                if dist(x, y) < r:
                    cl[-1].append(j) # Добавляем ’j’ в текущий кластер
                    a.remove(j) # Удаляем ’j’ из списка ’a’, чтобы не проверять его снова
    return cl

f = open("2_B.txt")
a = [list(map(float, i.replace(",", ".").split())) for i in f]
cl = dbscan(a, 0.4)
cl_total = []
for i in cl:
    if len(i) > 10: cl_total.append(i)
t = 0.08
ans = []
for i in cl_total:
    found_star = dbscan(i, t)
    duo_stars = []
    mx_starsys = []
    for j in found_star:
        if len(j) == 2:
            x = [j[0][0],j[0][1]]
            y = [j[1][0],j[1][1]]
            if -2.7 < j[0][2] < 0 and -2.7 < j[1][2] < 0:
                duo_stars.append([x,y])
    mx_dist = 0
    for j in duo_stars:
        if dist(j[0],j[1]) > mx_dist:
            mx_dist = dist(j[0],j[1])
            mx_starsys = j
    ans.append(mx_starsys)
                                                                                                  
                                                                                                  
# Рассчитываем среднее значение
res_X = 0
res_Y = 0
for i in ans:
    res_X += (i[0][0] + i[1][0])
    res_Y += (i[0][1] + i[1][1])

print(int(abs(res_X / 8) * 150))
print(int(abs(res_Y / 8) * 150))

Ответ: 1153 1326 1309 1150
Рулетка
Вы можете получить скидку в рулетке!