Задания
Версия для печати и копирования в MS Word
Тип 27 № 83157
i

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

Га­ран­ти­ру­ет­ся, что такое раз­би­е­ние су­ще­ству­ет и един­ствен­но для за­дан­ных раз­ме­ров пря­мо­уголь­ни­ков.

Будем на­зы­вать ан­ти­цен­тром кла­сте­ра точку этого кла­сте­ра, сумма рас­сто­я­ний от ко­то­рой до всех осталь­ных точек кла­сте­ра мак­си­маль­на. Для каж­до­го кла­сте­ра га­ран­ти­ру­ет­ся един­ствен­ность его ан­ти­цен­тра. Рас­сто­я­ние между двумя точ­ка­ми А (х1, y1) и B (х2, y2) на плос­ко­сти вы­чис­ля­ет­ся по фор­му­ле:

d левая круг­лая скоб­ка A, B пра­вая круг­лая скоб­ка = ко­рень из: на­ча­ло ар­гу­мен­та: левая круг­лая скоб­ка x_2 минус x_1 пра­вая круг­лая скоб­ка в квад­ра­те плюс левая круг­лая скоб­ка y_2 минус y_1 пра­вая круг­лая скоб­ка в квад­ра­те конец ар­гу­мен­та .

В файле А хра­нят­ся ко­ор­ди­на­ты точек двух кла­сте­ров, где Н  =  8, W  =  4 для каж­до­го кла­сте­ра. В каж­дой стро­ке за­пи­са­на ин­фор­ма­ция о рас­по­ло­же­нии на карте одной звез­ды: сна­ча­ла ко­ор­ди­на­та х, затем ко­ор­ди­на­та у. Зна­че­ния даны в услов­ных еди­ни­цах. Из­вест­но, что ко­ли­че­ство точек не пре­вы­ша­ет 1000.

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

Из­вест­но, что в файле Б име­ют­ся ко­ор­ди­на­ты ровно трёх «лиш­них» точек, пред­став­ля­ю­щих ано­ма­лии, ко­то­рые воз­ник­ли в ре­зуль­та­те помех при пе­ре­да­че дан­ных. Эти три точки не от­но­сят­ся ни к од­но­му из кла­сте­ров, их учи­ты­вать не нужно.

Файл A

Файл B

Для файла А опре­де­ли­те ко­ор­ди­на­ты ан­ти­цен­тра каж­до­го кла­сте­ра, затем вы­чис­ли­те два числа: P1  — сумма абс­цис­сы и ор­ди­на­ты ан­ти­цен­тра кла­сте­ра с наи­мень­шим ко­ли­че­ством точек, и P2  — сумма абс­цис­сы и ор­ди­на­ты ан­ти­цен­тра кла­сте­ра с наи­боль­шим ко­ли­че­ством точек. Га­ран­ти­ру­ет­ся, что во всех кла­сте­рах ко­ли­че­ство точек раз­лич­но.

Для файла Б опре­де­ли­те ко­ор­ди­на­ты ан­ти­цен­тра каж­до­го кла­сте­ра, затем вы­чис­ли­те два числа: Qx  — абс­цис­су наи­бо­лее отдалённого ан­ти­цен­тра кла­сте­ра от на­ча­ла ко­ор­ди­нат, и Qy  — ор­ди­на­ту бли­жай­ше­го ан­ти­цен­тра кла­сте­ра к на­ча­лу ко­ор­ди­нат.

В от­ве­те за­пи­ши­те че­ты­ре числа: в пер­вой стро­ке  — сна­ча­ла целую часть аб­со­лют­ной ве­ли­чи­ны про­из­ве­де­ния P1 × 10 000, затем целую часть аб­со­лют­ной ве­ли­чи­ны про­из­ве­де­ния P2 × 10 000; во вто­рой стро­ке  — сна­ча­ла целую часть про­из­ве­де­ния Qx × 10 000, затем целую часть про­из­ве­де­ния Qy × 10 000.

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

 

Ответ:

Спрятать решение

Ре­ше­ние.

По­стро­им диа­грам­мы для файла А и Б. Для этого вос­поль­зу­ем­ся таб­лич­ным ре­дак­то­ром.

 

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

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

 

При­ведём ре­ше­ние на языке Python для файла А.

from math import *

f = open('27.txt')

claster = [[] for i in range(2)]

for s in f:

x,y= map(float, s.split())

if y < 90:

claster[0].append((x,y))

else:

claster[1].append((x,y))

def centroid(claster):

rad = []

for i in claster:

rad.append((sum(dist(i,j) for j in claster),i))

return max(rad)[1]

len_claster = sorted(claster, key = len )

centr = [centroid(i) for i in len_claster]

P1 = sum(centr[0]) *10000

P2 = sum(centr[1]) *10000

print(int(abs(P1)), int(abs(P2)))

 

При­ведём ре­ше­ние на языке Python для файла В.

from math import *

f = open('27.txt')

claster = [[] for i in range(3)]

for s in f:

x,y= map(float, s.split())

if x > 16 and 32 > y > 24:

claster[0].append((x,y))

elif x > 16 and 41 > y > 33:

claster[1].append((x,y))

elif x > 16 and 50 > y > 42:

claster[2].append((x,y))

def centroid(claster):

rad = []

for i in claster:

rad.append((sum(dist(i,j) for j in claster),i))

return max(rad)[1]

 

centr = [centroid(i) for i in claster]

Qx = max([(dist(i, (0,0)), i) for i in centr])[1][0]

Qy = min([(dist(i, (0,0)), i) for i in centr])[1][1]

print(int(abs(Qx*10000)), int(abs(Qy*10000)))

 

Ответ: 1126711 1517181 213883 264132.


Аналоги к заданию № 83157: 83185 Все