Задачка на алгоритмы структуры данных.

программирование математика С++ делфи

Hа кольцевой парковке есть n мест пронумерованых от 1 до n. Есть два вида событий прибытие
машину на парковку и отъезд машины с парковки. Если машина приезжает на парковку, а её место
занято, то она едет далее по кругу и встаёт на первое свободное место.

Формат входного файла:
В первой строке входного файла находится два числа n и m — размер парковки и количество
запросов(1 ≤ n,m ≤ 100000). В следующих m строках находятся события. Каждая из этих строк
имеет следующий вид:

• enter x — приехала машина, которая хочет встать на место x. Для каждой такой команды
выведите какое место займёт эта машина.
• exit x — уехала машина занимавшая место x. Гарантируется, что на этом месте была машина.

Формат выходного файла:
Выведите последовательно результаты выполнения всех операций enter, т.е. какое место займёт вновь прибывшая машина.

Например:
3 5
enter 1
enter 1
exit 1
enter 2
enter 2

Должен выдать:
1
2
3
1

За линейное время делать нельзя (т.е. бежишь, смотришь, где свободно, там и поставлю)

Желательно на С++ или Delphi (сразу лучший ставлю :) ), ну или хотя бы какую структуру данных применить, чтобы это дело реализовать?

Нельзя использовать стандартных библиотек, STL, например.

Примечание:
Ну хотя бы можно описать алгоритмически, как это сделать.

Примечание:
Всё, допилил, Андрей_2009 - AVL - хорошо, но можно лучше, уже запилил через дерево отрезков? но всё равно твой лучший, так что лови....
Ответы:
> сразу лучший ставлю :)
Долго будешь ждать
Структура данных - список с приоритетом. Список состоит из занятых номеров, упорядоченных по возрастанию.
Очень удобно реализовать в динамическом массиве.
На i-ом(С : (i-1)-ом) месте стоит 0 если место занято, и 1 если место свободно.
Когда ставишь машину обращаешься к соответствующему элементу массива, если там 1  идёшь по массиву дальше, пока не встретишь 0, если добежал до конца массива переходишь в начало и бежишь опять до i-ого, если нигде не встретился 0, то парковка полна.
Когда машину уезжает просто 1 меняется на 0.
Любое сбалансированное бинарное дерево поиска. Например, AVL-дерево. Время каждой операции -- lg (n). Это лучше, чем (n). Дерево будет хранить свободные места.
Каждый элемент дерева будет содержать число, соответствующее свободному месту, и ссылку на детей. Функция поиска свободного места возвращает наименьший элемент, который больше или равен x. (первое свободное место).
Работает она так: смотрит узел, с которого её запустили. Если текущее место совпадает с X, то функция возвращает X. Если место > x, то функция рекурсивно запускает себя к левому потомку дерева. Если место < x, то функция рекурсивно запускает себя к правому потомку. Если левого потомка нет, то значит мы нашли ближайшее свободное место. Если правого потомка нет, то искомым элементом будет последний элемент, у которого мы пошли к левому потомку. Или можно просто свернуть всю ветвь рекурсии и искать среди пройденных элементов наименьший элемент, больший X. Не знаю, что будет закодить проще. Основной принцип я вам объяснил. Всё остальное (сохранение баланса (вращение), добавление, удаление элементов) аналогично обычному AVL-дереву.
ЗЫ: такой вопрос меньше чем на 50 баллов не тянет.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.