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

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

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

Будем на­зы­вать меж­кла­стер­ным диа­мет­ром двух кла­сте­ров мак­си­маль­ное рас­сто­я­ние между двумя точ­ка­ми, одна из ко­то­рых при­над­ле­жит од­но­му кла­сте­ру, а вто­рая  — дру­го­му. Для каж­дой пары кла­сте­ров га­ран­ти­ру­ет­ся, что меж­кла­стер­ный диа­метр об­ра­зу­ет един­ствен­ная пара точек. Рас­сто­я­ние между двумя точ­ка­ми на плос­ко­сти A(x1, y1) и B(x2, y2) вы­чис­ля­ет­ся по фор­му­ле:

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

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

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

Файл А

Файл Б

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

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

Для обоих фай­лов опре­де­ли­те меж­кла­стер­ные диа­мет­ры для каж­дой пары раз­лич­ных кла­сте­ров. Для файла А най­ди­те два числа: Px  — мо­дуль раз­но­сти абс­цисс точек, об­ра­зу­ю­щих меж­кла­стер­ный диа­метр и Py – сумму ор­ди­нат точек, об­ра­зу­ю­щих меж­кла­стер­ный диа­метр. Для файла Б най­ди­те два числа: Q1  — сумму всех меж­кла­стер­ных диа­мет­ров и Q2  — мак­си­маль­ное рас­сто­я­ние от какой-либо точки, об­ра­зу­ю­щей меж­кла­стер­ный диа­метр, до точки с ко­ор­ди­на­та­ми (1, 1).

В от­ве­те за­пи­ши­те че­ты­ре числа: в пер­вой стро­ке – сна­ча­ла целую часть про­из­ве­де­ния Px × 1000, затем целую часть аб­со­лют­но­го зна­че­ния про­из­ве­де­ния Py × 1000; во вто­рой стро­ке – сна­ча­ла целую часть про­из­ве­де­ния Q1 × 100, затем целую часть про­из­ве­де­ния Q2 × 100. Воз­мож­ные дан­ные од­но­го из фай­лов ил­лю­стри­ро­ва­ны гра­фи­ком.

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

Для вы­пол­не­ния за­да­ния ис­поль­зуй­те дан­ные из при­ла­га­е­мо­го файла.

 

Ответ:

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

Ре­ше­ние.

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

from math import dist

data = []

 

for s in open('27a.txt'):

x, y = [float(d) for d in s.replace(',', '.').split()]

data.append([x, y])

rast = 2

clusters = []

while data:

cl = [data.pop()]

for p in cl:

sosed = [p1 for p1 in data if dist(p, p1) < rast]

for p1 in sosed:

cl.append(p1)

data.remove(p1)

clusters.append(cl)

clusters.sort(key=len)

def rast_clast(cluster1, cluster2):

res = []

for s1 in cluster1:

for s2 in cluster2:

res.append([dist(s1,s2), s1, s2])

return max(res)

 

mez_diam = rast_clast(clusters[0], clusters[1])

Px = abs(mez_diam[1][0] - mez_diam[2][0]) *1000

Py = abs((mez_diam[1][1] + mez_diam[2][1]) *1000)

print(int(Px), int(Py))

 

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

from math import dist

data = []

for s in open('27b.txt'):

x, y = [float(d) for d in s.replace(',', '.').split()]

data.append([x, y])

rast = 3

clusters = []

while data:

cl = [data.pop()]

for p in cl:

sosed = [p1 for p1 in data if dist(p, p1) < rast]

for p1 in sosed:

cl.append(p1)

data.remove(p1)

if len(cl) >= 2:

clusters.append(cl)

clusters.sort(key=len)

#print(*[len(cl) for cl in clusters]) # - про­ве­ря­ет кол-во кла­сте­ров

# 2 кла­сте­ра для файла A и 3 для файла B

# В слу­чае про­ти­во­ре­чия ме­ня­ем rast - это зна­че­ние

def rast_clast(cluster1, cluster2):

res = []

for s1 in cluster1:

for s2 in cluster2:

res.append([dist(s1,s2), s1, s2])

return max(res)

mez_diam = [rast_clast(clusters[i], clusters[j]) for i in range(len(clusters)) for j in range(i+1, len(clusters))]

Q1 = sum(d[0] for d in mez_diam) *100

Q2 = max(dist(i,[1,1]) for d in mez_diam for i in d[1:]) * 100

print(int(Q1),int(Q2))

 

 

 

 

Ответ: 21549 1946 7140 2018.


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