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

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

Для каж­дой звез­ды дана ха­рак­те­ри­сти­ка: тип цвета, тип све­ти­мо­сти и её раз­мер в со­от­вет­ствии с таб­ли­цей.

 

Обо­зна­че­ниеЦветОбо­зна­че­ниеРаз­мер
GбелыйIсверх­ги­гант
Jзе­ле­ныйIIяркий ги­гант
LсинийIIIги­гант
Nоран­же­выйIVсуб­ги­гант
Yкрас­ныйVкар­лик
Sго­лу­бойVIсуб­кар­лик
Zжел­тыйVIIбелый кар­лик

 

По­лу­чен­ные зна­че­ния за­пи­са­ны в ха­рак­те­ри­сти­ке слит­но: обо­зна­че­ние цвета, све­ти­мость (араб­ская цифра) и обо­зна­че­ние раз­ме­ра.

Будем на­зы­вать цен­тром кла­сте­ра точку этого кла­сте­ра, сумма рас­сто­я­ний от ко­то­рой до всех осталь­ных точек кла­сте­ра ми­ни­маль­на (цен­т­ро­ид).

В файле А хра­нят­ся дан­ные о звёздах двух кла­сте­ров, где H  =  6,5, W  =  4,5 для каж­до­го кла­сте­ра. В каж­дой стро­ке за­пи­са­на ко­ор­ди­на­та x, затем ко­ор­ди­на­та y, а затем её ха­рак­те­ри­сти­ка. В файле Б хра­нят­ся ана­ло­гич­ные дан­ные о звёздах трёх кла­сте­ров.

Опре­де­ли­те ко­ор­ди­на­ты цен­тра каж­до­го кла­сте­ра для файла А, затем най­ди­те два числа: A1  — абс­цис­са цен­тра кла­сте­ра с наи­мень­шим ко­ли­че­ством звёзд све­ти­мо­сти 2, и A2  — ор­ди­на­та цен­тра кла­сте­ра с наи­боль­шим ко­ли­че­ством звёзд све­ти­мо­сти 2.

Опре­де­ли­те ко­ор­ди­на­ты цен­тра каж­до­го кла­сте­ра для файла Б, затем най­ди­те два числа: B1  — рас­сто­я­ние между цен­тра­ми кла­сте­ров с ми­ни­маль­ным и мак­си­маль­ным ко­ли­че­ством крас­ных звёзд, и B2  — наи­боль­шее рас­сто­я­ние между цен­тром кла­сте­ра и крас­ной звез­дой из этого же кла­сте­ра.

Файл A

Файл B

В от­ве­те ука­жи­те сна­ча­ла целые части про­из­ве­де­ний A1 × 10 000 и A2 × 10 000, а во вто­рой стро­ке  — B1 × 10 000 и B2 × 10 000

 

Ответ:

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

Ре­ше­ние.

По­стро­им диа­грам­му для файла А и В. Для этого от­кро­ем файлы с по­мо­щью python.

Гра­фик для файла А:

Гра­фик для файла В:

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

import tkinter as tk

import math

all_stars = []

with open('27-3-B.txt') as f:

for line in f:

line = line.replace(',', '.').strip()

parts = line.split()

# Чи­та­ем ко­ор­ди­на­ты и тип

raw_x = float(parts[0])

raw_y = float(parts[1])

info = parts[2]

all_stars.append((raw_x, raw_y, info))

#На­хо­дим экс­тре­му­мы для жест­ко­го мас­шта­би­ро­ва­ния

if all_stars:

xs = [s[0] for s in all_stars]

ys = [s[1] for s in all_stars]

min_x, max_x = min(xs), max(xs)

min_y, max_y = min(ys), max(ys)

# За­да­ем фик­си­ро­ван­ный раз­мер окна

W, H = 1000, 700

pad = 50 # От­ступ от краев, чтобы точки не при­ли­па­ли к рамке

# За­щи­та от де­ле­ния на ноль, если все ко­ор­ди­на­ты оди­на­ко­вые

dx = (max_x - min_x) if max_x != min_x else 1

dy = (max_y - min_y) if max_y != min_y else 1

# Рас­счи­ты­ва­ем SCALE

SCALE_X = (W - 2 * pad) / dx

SCALE_Y = (H - 2 * pad) / dy

SCALE = min(SCALE_X, SCALE_Y)

print(f"[+] Гра­ни­цы дан­ных: X от {min_x} до {max_x}, Y от {min_y} до {max_y}")

print(f"[+] Вы­чис­лен­ный мас­штаб от­ри­сов­ки (SCALE): {round(SCALE, 4)}")

else:

min_x, min_y, SCALE, pad, W, H = 0, 0, 1, 50, 1000, 700

# Пе­ре­вод в пик­се­ли

def to_px(rx, ry):

px = (rx - min_x) * SCALE + pad

py = H - ((ry - min_y) * SCALE + pad) # Ин­вер­сия Y для нор­маль­ной де­кар­то­вой сетки

return px, py

# Клик-об­ра­бот­чик

def click_handler(event):

if not all_stars: return

# Пе­ре­во­дим пик­се­ли клика об­рат­но в ма­те­ма­ти­ку файла

cx = min_x + (event.x - pad) / SCALE

cy = min_y + (H - event.y - pad) / SCALE

closest = None

min_d = float('inf')

for star in all_stars:

rx, ry, info = star

d = math.hypot(cx - rx, cy - ry)

if d < min_d:

min_d = d

closest = star

rx, ry, info = closest

print(f"+ Клик мыш­кой по экра­ну в пик­се­лях: ({event.x}, {event.y})")

print(f"* Бли­жай­шая к клику ре­аль­ная звез­да: X = {rx}, Y = {ry}, Тип = {info}")

print("-" * 50)

# 3. Гра­фи­че­ский ин­тер­фейс Tkinter

root = tk.Tk()

root.title("Кли­кер Кла­сте­ров")

canvas = tk.Canvas(root, width=W, height=H, bg='black')

canvas.pack()

canvas.bind("<1>", click_handler)

# От­ри­сов­ка

for rx, ry, info in all_stars:

px, py = to_px(rx, ry)

color = 0

#print(info[0], info[2:])

# Цве­то­вая под­свет­ка

if '2' == info[1]:

color = 'white'

elif 'Y' == info[0]:

color = 'red'

# Можно те­гать для удоб­ства уби­рая лиш­ние звёзды

else:

color = '#444444' # Обыч­ные серые фо­но­вые звез­ды

# Ри­су­ем жир­ные, за­мет­ные квад­ра­ты 2х2 пик­се­ля

if color:

canvas.create_rectangle(px-1, py-1, px+1, py+1, fill=color, outline=color)

# Для файла A

#border_y = 10

#cluster_1 = [s for s in all_stars if s[1] < border_y]

#cluster_2 = [s for s in all_stars if s[1] > border_y]

# Для файла B

cluster_1 = [s for s in all_stars if 15 < s[1] < 21]

cluster_2 = [s for s in all_stars if s[1] < 15]

cluster_3 = [s for s in all_stars if s[1] > 21]

def best_centroid(target_cluster):

best_center = None

min_sum = float('inf')

for cx, cy, _ in target_cluster:

curr_sum = sum(math.hypot(cx - px, cy - py) for px, py, _ in target_cluster)

if curr_sum < min_sum:

min_sum = curr_sum

best_center = (cx, cy)

print(best_center)

# Для файла A

#best_centroid(cluster_2), best_centroid(cluster_1)

# От­ве­ты A1 и A2

#print(int(7.0391548 * 10**4))

#print(int(6.1225014 * 10**4))

 

# Для файла B

best_centroid(cluster_1), best_centroid(cluster_2), best_centroid(cluster_3)

# От­ве­ты B1 и B2

print(int(((abs( 15.861917 - 26.6431823))**2 + (abs(18.8540334 - 12.4121727))**2)**0.5 * 10**4))

print(int(((abs(26.6431823 - 25.4158094))**2 + (abs(12.4121727 - 10.8232407))**2)**0.5 * 10**4))

root.mainloop()

 

Источник: ЕГЭ—2026. Ос­нов­ная волна 18.06.2026. Под­бор­ка Школ­ко­во