Задания
Версия для печати и копирования в MS Word
Тип 27 № 81811
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  =  4,5 для каж­до­го кла­сте­ра. В каж­дой стро­ке за­пи­са­на ин­фор­ма­ция о рас­по­ло­же­нии на карте одной звез­ды: сна­ча­ла ко­ор­ди­на­та x, затем ко­ор­ди­на­та y. Зна­че­ния даны в услов­ных еди­ни­цах. Из­вест­но, что ко­ли­че­ство звёзд не пре­вы­ша­ет 10 000.

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

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

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

Файл A

Файл B

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

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

Га­ран­ти­ру­ет­ся, что во всех кла­сте­рах ко­ли­че­ство точек раз­лич­но.

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

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

 

Ответ:

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

Ре­ше­ние.

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

 

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

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

 

 

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

from math import *

 

f = open('DEMO_27_A.txt')

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

for s in f:

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

if y < 8:

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 min(rad)[1]

 

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

Px = min(x for x, y in centr) *10000

Py = min(y for x, y in centr) *10000

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

 

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

from math import *

 

f = open('DEMO_27_B.txt')

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

for s in f:

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

if 14 > x > 8 and 18 > y > 12:

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

elif 18 > x > 12 and 27 > y > 22:

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

elif 23 > x > 18 and 26 > y > 23:

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 min(rad)[1]

 

def max_d(claster):

return max(dist(centroid(claster),i) for i in claster)

 

claster_s = sorted(claster, key=len)

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

Q1 = dist(centr[0], centr[2])

Q2 = max(max_d(i) for i in claster_s)

print(int(Q1 * 10000), int(Q2 * 10000))

 

Ответ:

38471 61225

142058 25299

 

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

f = open('DEMO_27_A.txt')

f.readline()

ans = []

min_summ = 10**10

stars = [list(map(float, s.replace(',','.').split())) for s in f]

for i in range (len(stars) - 1):

for j in range(i+1, len (stars) - 1):

center1 = stars[i]

center2 = stars[j]

summ = 0

for star in stars:

d1 = ((star[0] - center1[0]) ** 2 + (star[1] - center1[1]) ** 2)**0.5

d2 = ((star[0] - center2[0]) ** 2 + (star[1] - center2[1]) ** 2)**0.5

summ += min(d1, d2)

if summ < min_summ:

min_summ = summ

ans = [center1, center2]

print(min(ans[0][0], ans[1][0]) * 10000, min(ans[0][1],ans[1][1]) * 10000)

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

from math import dist

def clusterization(stars,radius): # кла­сте­ри­за­ция

clusters=[]

while stars:

cluster=[stars.pop()]

for c in cluster:

near=[s for s in stars if dist(c,s) < radius]

cluster+=near

for n in near: stars.remove(n)

clusters.append(cluster)

return clusters

def center(cluster): # на­хож­де­ние цен­тра кла­сте­ра

sumdist=[sum([dist(star1,star2) for star1 in cluster]) for star2 in cluster]

return cluster[sumdist.index(min(sumdist))]

def maxdist(cluster,center): # мак­си­маль­ное рас­сто­я­ние от цен­тра кла­сте­ра до звез­ды

return max([dist(s,center) for s in cluster])

radius = 1 # по­ро­го­вое рас­сто­я­ние для кла­сте­ри­за­ции

# Файл A

stars = [tuple(map(float,s.replace(',','.').split())) for s in open('DEMO_27_A.txt')]

clusters=clusterization(stars,radius)

print('кла­сте­ров:',len(clusters),'; точек:',*[len(c) for c in clusters]) # для кон­тро­ля

centers=[center(c) for c in clusters]

print(int(min([x[0] for x in centers])*10000),int(min([x[1] for x in centers])*10000))

# Файл B

stars = [tuple(map(float,s.replace(',','.').split())) for s in open('DEMO_27_B.txt')]

clusters=clusterization(stars,radius)

print('кла­сте­ров:',len(clusters),'; точек:',*[len(c) for c in clusters])

clusters=[c for c in clusters if len(c)>1] # уда­ле­ние кла­сте­ров из одной звез­ды

centers=[center(c) for c in clusters]

numbers=[len(c) for c in clusters] # ко­ли­че­ства звезд в кла­сте­рах

q1=dist(centers[numbers.index(min(numbers))],centers[numbers.index(max(numbers))])

q2=max([maxdist(clusters[i],centers[i]) for i in range(len(clusters))])

print(int(q1*10000),int(q2*10000))

Источник: Де­мон­стра­ци­он­ная вер­сия ЕГЭ−2026 по ин­фор­ма­ти­ке