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

Учёный решил про­ве­сти кла­сте­ри­за­цию не­ко­то­ро­го мно­же­ства звёзд по их рас­по­ло­же­нию на карте звёзд­но­го неба. Кла­стер звёзд  — это набор звёзд (точек) на гра­фи­ке. Каж­дый кла­стер имеет форму пря­мо­уголь­ни­ка, причём эти пря­мо­уголь­ни­ки между собой не пе­ре­се­ка­ют­ся. Центр кла­сте­ра  — это одна из звёзд на гра­фи­ке, сумма рас­сто­я­ний от ко­то­рой до всех осталь­ных звёзд кла­сте­ра ми­ни­маль­на.

В файле А хра­нят­ся дан­ные о звёздах 2-⁠х кла­сте­ров, в файле Б хра­нят­ся дан­ные о звёздах 3-⁠х кла­сте­ров. Для каж­дой звез­ды дана ха­рак­те­ри­сти­ка: тип цвета, тип све­ти­мо­сти и её раз­мер в со­от­вет­ствии с таб­ли­цей.

 

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

 

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

Рас­сто­я­ние между двумя точ­ка­ми A(x1; y1) и B(x2; y2) вы­чис­ля­ет­ся по фор­му­ле:

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

Даны два вход­ных файла (файл А и файл Б). Для файла А опре­де­ли­те ко­ор­ди­на­ты цен­тра каж­до­го кла­сте­ра, затем най­ди­те два числа: A1  — ми­ни­маль­ное рас­сто­я­ние от цен­тра кла­сте­ра с наи­мень­шим ко­ли­че­ством точек до крас­но­го ги­ган­та, и A2  — мак­си­маль­ное рас­сто­я­ние от цен­тра кла­сте­ра с наи­мень­шим ко­ли­че­ством точек до крас­но­го ги­ган­та.

Для файла Б опре­де­ли­те ко­ор­ди­на­ты цен­тра каж­до­го кла­сте­ра, затем най­ди­те два числа: 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-1-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 'Y' == info[0] and 'III' == info[2:]:

color = 'red' # Крас­ный ги­гант

elif 'Z' == info[0] and 'V' == info[2:]:

color = 'yellow' # Жел­тый кар­лик

 

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

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]

 

# Вы­би­ра­ем тот спи­сок, у ко­то­ро­го len() мень­ше:

#target_cluster = cluster_1 if len(cluster_1) < len(cluster_2) else cluster_2

 

# Для файла B

cluster_1 = [s for s in all_stars if s[1] < 14.2]

cluster_2 = [s for s in all_stars if s[1] > 24]

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(target_cluster)

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

#print(int(((abs(6.6765541 - 7.0391548))**2 + (abs(12.0231751 - 12.3587258))**2)**0.5 * 10**4))

#print(int(((abs(2.8440425 - 7.0391548))**2 + (abs(6.226045 - 12.3587258))**2)**0.5 * 10**4))

 

# Для файла B

best_centroid(cluster_1), best_centroid(cluster_2)

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

print(int(((abs( 26.7044059 - 26.4871419))**2 + (abs(11.5764761 - 11.5419927))**2)**0.5 * 10**4))

print(int(((abs(26.6431823 - 13.9823808))**2 + (abs(12.4121727 - 26.4800432))**2)**0.5 * 10**4))

root.mainloop()

 

 

 

Источник: ЕГЭ—2026. Ос­нов­ная волна 18.06.2026. Даль­ний Во­сток