💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 1 из 20
Какие интервалы выберет алгоритм?
Python Копировать
intervals = [(1, 4), (3, 5), (0, 6), (5, 7), (3, 9), (7, 8)]
intervals.sort(key=lambda x: x[1])
chosen = []
end = float('-inf')
for start, finish in intervals:
if start >= end:
chosen.append((start, finish))
end = finish
print(chosen)
[(0,6),(7,8)]
[(1,4),(3,5),(5,7),(7,8)]
[(3,5),(5,7),(7,8)]
[(1,4),(5,7),(7,8)]
Вопрос 2 из 20
Какие монеты выберет правило «каждый раз брать крупнейший подходящий номинал»?
4+1+1=6
Python Копировать
coins = [1, 3, 4]
amount = 6
used = []
for coin in sorted(coins, reverse=True):
while amount >= coin:
amount -= coin
used.append(coin)
print(used)
[4,1,1]
[4,3]
[1,1,1,1,1,1]
[3,3]
Вопрос 4 из 20
Какие два символа будут объединены первыми и какой вес получит новый узел?
Python Копировать
from heapq import heapify, heappop, heappush
heap = [(5, 'A'), (9, 'B'), (12, 'C'), (13, 'D')]
heapify(heap)
x = heappop(heap)
y = heappop(heap)
print(x[1], y[1], x[0] + y[0])
A B 14
B C 21
C D 25
A C 17
Вопрос 6 из 20
Какой обмен лежит в основе доказательства выбора раннего окончания?
Python Копировать
greedy_first = (1, 3) # заканчивается раньше всех
optimal_first = (0, 5) # первое событие в некотором оптимуме
rest = [(5, 7), (7, 9)]
# Нужно обосновать замену optimal_first на greedy_first,
# не уменьшая число мероприятий в расписании.
Удалить из расписания все мероприятия, начинающиеся после G, и оставить выбранный префикс
Добавить G рядом с O без замены, даже если два мероприятия занимают одно время
Заменить G самым длинным совместимым мероприятием, чтобы оставить меньше промежутков
Заменить O на G; остальные мероприятия после O остаются совместимыми и после G
Вопрос 10 из 20
Какое свойство используется в алгоритме Прима?
Python Копировать
from heapq import heappop
used = {0, 2}
frontier = [(3, 2, 1), (5, 0, 3), (8, 2, 4)]
weight, inside, outside = heappop(frontier)
used.add(outside)
# Затем в очередь добавляются рёбра новой вершины.
Все рёбра разреза имеют одинаковый вес
Любое ребро внутри S обязательно входит в остов
Самое тяжёлое ребро разреза безопасно
Самое лёгкое ребро разреза безопасно для некоторого минимального остова
Вопрос 13 из 20
Почему выбор ближайшей по весу ещё не посещённой вершины не гарантирует минимальный гамильтонов цикл?
Python Копировать
# Произвольные стоимости переходов в полном взвешенном графе.
distance = [
[0, 1, 2, 100],
[1, 0, 1, 2],
[2, 1, 0, 1],
[100, 2, 1, 0],
]
current = 0
unvisited = {1, 2, 3}
route = [current]
while unvisited:
current = min(unvisited, key=lambda v: distance[current][v])
unvisited.remove(current)
route.append(current)
route.append(route[0])
В симметричном графе ближайший сосед всегда строит кратчайший путь, но не умеет замкнуть его в цикл
Последнее возвращающее ребро может оказаться очень дорогим, хотя предыдущие локальные переходы были дешёвыми
После каждого перехода нужно пересчитывать веса между оставшимися вершинами, иначе маршрут некорректен
Проблема возникает только при равных весах; если все веса различны, правило оптимально
Вопрос 15 из 20
Что произойдёт, если первым выбрать самый короткий интервал \( (3,5) \)?
Python Копировать
intervals = [(0, 4), (4, 8), (3, 5)]
После него удастся добавить оба остальных интервала и получить расписание из трёх
Он оставит расписание из одного интервала, хотя \( (0,4) \) и \( (4,8) \) совместимы и дают два
Он исключит только интервал \( (0,4) \), но позволит затем выбрать \( (4,8) \)
Такой выбор совпадёт с правилом самого раннего окончания и даст оптимальные два интервала
Вопрос 16 из 20
Сколько комнат нужно?
Python Копировать
meetings = [(0, 10), (5, 7), (6, 8), (9, 12)]
events = []
for s, e in meetings:
events.append((s, 1))
events.append((e, -1))
events.sort(key=lambda x: (x[0], x[1]))
current = best = 0
for _, delta in events:
current += delta
best = max(best, current)
print(best)
2
3
4
5
Вопрос 17 из 20
Какой суммарный вес получит лес Краскала?
Python Копировать
edges = [(1,0,1),(2,1,2),(3,0,2),(4,2,3),(5,1,3)]
parent = list(range(4))
def find(x):
while parent[x] != x:
parent[x] = parent[parent[x]]
x = parent[x]
return x
total = 0
for w,u,v in sorted(edges):
ru, rv = find(u), find(v)
if ru != rv:
parent[rv] = ru
total += w
print(total)
6
7
8
9