Бесплатное занятие с репетитором 1 на 1! Оценим уровень знаний, разберём тему,
сформируем план подготовки к ЕГЭ. Запишись через тг-бот

осталось мест 52
Новая Школа - онлайн-школа подготовки к ЕГЭ
При поддержке
Тренировки Пробники Статистика Карточки Учебник Об экзамене Учительская
  • Тренажёр заданий ЕГЭ
  • Тренажёр ЕГЭ по Информатике
  • Список заданий №27
  • Задание №27
  • Задание №88375 ЕГЭ Информатике

    Условие задания #88375

    №27 по КИМ

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

    Истинный центр кластера, или центроид,  — это одна из звёзд на графике, сумма расстояний от которой до всех остальных звёзд кластера минимальна. Под расстоянием понимается расстояние Евклида между двумя точками A(x1, y1) и B(x2, y2) на плоскости, которое вычисляется по формуле:

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

    В файле A хранятся данные о звёздах двух кластеров, где H  =  3, W  =  3 для каждого кластера. В каждой строке записана информация о расположении на карте одной звезды: сначала координата x, затем координата y. Значения даны в условных единицах. Известно, что количество звёзд не превышает 1000.

    В файле Б хранятся данные о звёздах трёх кластеров, где H  =  3, W  =  3 для каждого кластера. Известно, что количество звёзд не превышает 10 000.

    Структура хранения информации о звездах в файле Б аналогична файлу А.

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

    В ответе запишите четыре числа: в первой строке сначала целую часть произведения Px × 10 000 , затем целую часть произведения Py × 10 000 для файла А, во второй строке  — аналогичные данные для файла Б.

    27-3a.txt27-3b.txt

    Ответ

    Ответ:

    32055 58097 31886 25834

    Решение

    Файл A


    K = 2  # количество кластеров

    def findClusterNo( x, y ):
      return 0 if x < 3 else 1

    #------------------------------------------------

    clusters = [ [] for i in range(K) ]

    for s in open("27-3a.txt"):
        x, y = s.replace(',','.').split()
        x, y = float(x), float(y)
        clusterNo = findClusterNo( x, y )
        clusters[clusterNo].append( (x, y) )

    import math
    def dist( p1, p2 ):
      #return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2) ** 0.5
      return math.hypot( p1[0] - p2[0], p1[1] - p2[1] )

    centers = []
    for k in range(K):
      minSumDist = float('inf')
      for pCenter in clusters[k]:
        sumDist = sum( dist(pCenter,p)
                       for p in clusters[k] )
        if sumDist < minSumDist:
          minSumDist = sumDist
          center = pCenter
      centers.append( center )

    print( "Центроиды:\n", centers )

    sumX, sumY = 0, 0
    for k in range(K):
      sumX += centers[k][0]
      sumY += centers[k][1]

    print( int(sumX/K*10000), int(sumY/K*10000) )

     

    Файл B


    K = 3  # количество кластеров

    def findClusterNo( x, y ):
      return 0 if x > 4 else \
             1 if y > 2 else \
             2

    #------------------------------------------------

    clusters = [ [] for i in range(K) ]

    for s in open("27-3b.txt"):
        x, y = s.replace(',','.').split()
        x, y = float(x), float(y)
        clusterNo = findClusterNo( x, y )
        clusters[clusterNo].append( (x, y) )

    import math
    def dist( p1, p2 ):
      #return ((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2) ** 0.5
      return math.hypot( p1[0] - p2[0], p1[1] - p2[1] )

    centers = []
    for k in range(K):
      minSumDist = float('inf')
      for pCenter in clusters[k]:
        sumDist = sum( dist(pCenter,p)
                       for p in clusters[k] )
        if sumDist < minSumDist:
          minSumDist = sumDist
          center = pCenter
      centers.append( center )

    print( "Центроиды:\n", centers )

    sumX, sumY = 0, 0
    for k in range(K):
      sumX += centers[k][0]
      sumY += centers[k][1]

    print( int(sumX/K*10000), int(sumY/K*10000) )

    Понятно ли решение?

    Решения от учеников
    0

    Похожие задания

    15
    Задание №88376Задание №88377Задание №88378Задание №88379Задание №88380Задание №88381Задание №88382Задание №88383Задание №88384Задание №88385Задание №88386Задание №88387Задание №88388Задание №88389Задание №88374
    Бесплатно

    Решай задачи ЕГЭ в приложении

    Скачивай наш Тренажер ЕГЭ на iPhone или Android и тренируйся в любое время и в любом месте!

    Саша — ассистент в телеграмме