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

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

раз­ме­ров пря­мо­уголь­ни­ков.

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

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

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

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

Файл А

Файл Б

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

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

Для файла Б опре­де­ли­те ко­ор­ди­на­ты цен­тра каж­до­го кла­сте­ра, затем вы­чис­ли­те два числа: Q1  — ми­ни­маль­ное рас­сто­я­ние между цен­тром кла­сте­ра и точ­кой (1,7; 2,3) и Q2  — мак­си­маль­ное рас­сто­я­ние между этой же точ­кой и цен­тром кла­сте­ра.

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

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

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

 

Ответ:

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

Ре­ше­ние.

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

from math import dist

data = []

# Для А/Б

for s in open('27_B.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)

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

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

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

def centroid(cl):

m = []

for p in cl:

s = 0

for p1 in cl:

s += dist(p, p1)

m.append([s, p])

return min(m)[1]

cen = [centroid(cl) for cl in clusters]

#Ре­ше­ние для А

P1 = len([i for i in clusters[1] if dist(i, cen[1]) <= 0.7])

P2 = len([i for i in clusters[0] if dist(i, cen[0]) > 1.3])

print(P1, P2)

#Ре­ше­ние для А

tocka = (1.7, 2.3)

Q1 = min(dist(tocka, p) for p in cen)*10000

Q2 = max(dist(tocka, p) for p in cen)*10000

print(Q1, Q2)

 

Ответ: 5 189 261162 371295.


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