Рассадка групп в ряду по наилучшему месту

Задача по программированию с проверкой онлайн

Сложность
Сложная
Языки
Python
JavaScript
TypeScript
Java
Go
Темы
Классы и ООП
Поиск и сортировка
Исключения

Реализуйте кассу для одного длинного ряда из n мест с номерами от 0 до n − 1 (1 ≤ n ≤ 10⁹), сначала все места свободны. Даны список операций operations и список их аргументов values (values[i] относится к operations[i]). Верните список результатов, по одному на операцию. Свободный блок — это максимальный отрезок подряд идущих свободных мест.

Операции:

  • "book" с аргументом k: посадить группу из k человек рядом. Выбирается самый короткий свободный блок длиной не меньше k, при равной длине — самый левый; группа занимает k его левых мест. Результат: номер первого места группы, или -1, если ни один блок не подходит (тогда ничего не меняется).
  • "cancel" с аргументом s: отменить бронь группы, чьё первое место — s; её места освобождаются и сливаются с соседними свободными блоками. Результат: размер группы.
  • "largest": длина самого длинного свободного блока, 0, если свободных мест нет.
  • "blocks": число свободных блоков.
  • "owner" с аргументом seat: первое место группы, которая занимает это место, или -1, если оно свободно.

Если k < 1, если ни одна текущая бронь не начинается с места s, или если seat вне [0, n − 1], сообщите об ошибке: бросьте исключение, в Go верните error. Ошибка относится ко всему вызову: первая же неверная операция прерывает его. До 1000 операций.

Пример: 10, ["book", "book", "book", "cancel", "book"], [[3], [4], [2], [3], [2]] → [0, 3, 7, 4, 3].


Источник: задача CodeShare

Решить онлайнБесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).

Ещё задачи

Все задачи для тренировки