💡 Инструкция: Выбери один ответ из четырёх. В тесте 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),(5,7),(7,8)]
[(1,4),(3,5),(5,7),(7,8)]
[(3,5),(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,3]
[3,3]
[4,1,1]
[1,1,1,1,1,1]
Вопрос 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 C 17
C D 25
B C 21
A B 14
Вопрос 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
9
8
7