Задача написать программу читающую из файла описания операций с очередью и выводящую в другой файл результат выполнения всех операций extract-min. Если перед очередной операцией extract-min очередь пуста, выводит вместо числа звездочку.
Пример:
priorityqueue.in priorityqueue.out
push 3 2
push 4 1
push 2 3
extract-min *
decrease-key 2 1
extract-min
extract-min
extract-min
Я написал реализацию с использованием списка, куда каждый элемента добавлял с бинарным поиском, чтобы массив был всегда отсортирован
import bisect, sys
sys.stdout = open("priorityqueue.out", "w")
queue = []
operations = open("priorityqueue.in").read().strip().split("\n")
for op in operations:
op_parsed = op.split()
if op_parsed[0] == "push":
bisect.insort(queue, int(op_parsed[1]))
elif op_parsed[0] == "extract-min":
try:
print(queue[0])
del queue[0]
except:
print("*")
else:
del queue[int(op_parsed[1]) - 1]
bisect.insort(queue, int(op_parsed[2]))
Но проблема в том, что на некотором тесте была "ошибка времени исполнения". Как я выяснил эмпирическим путем на строчке del queue[int(op_parsed[1]) - 1]
кидается исключение и скорее всего это было IndexError
, но из-за чего оно кидается я понять не могу.
До этого я написал реализацию с использованием heapq
у которой тоже была "ошибка времени исполнения" на том же месте
import heapq, sys
sys.stdout = open("priorityqueue.out", "w")
queue = []
operations = open("priorityqueue.in").read().strip().split("\n")
for op in operations:
op_parsed = op.split()
if op_parsed[0] == "push":
heapq.heappush(queue, int(op_parsed[1]))
elif op_parsed[0] == "extract-min":
try:
print(heapq.heappop(queue))
except IndexError:
print("*")
else:
queue[int(op_parsed[1]) - 1] = queue[-1]
queue.pop()
heapq.heappush(queue, int(op_parsed[2]))
P.S. При попытке добавления блока
try:
...
except:
pass
"ошибка времени исполнения" заменяется на "неверный ответ" на том же тесте
В команде decrease-key 2 1
второй элемент это значение элемента в куче, а не его индекс в ней. Используй в командах push 3
значения больше, чем предположительный размер кучи и скрипт повалится раньше.
Делай так:
del queue[queue.index(op_parsed[1])]
А ее лучше, если заменишь del
на .pop()
:
queue.pop(queue.index(op_parsed[1]))
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня есть форма с двумя кнопками, называющимися aButton и bButtonХочу, чтоб по нажатию мышкой на aButton выполнялась функция myFunctionMouseClickA, а по нажатию...
Задача следующая, нужно что бы перейдя по ссылке сразу получить изображение QR кода согласно get параметров в URLКак например тут
Работаю на WPF MVVM + EF6 + SQL Server