Рассадка групп в ряду по наилучшему месту
Задача по программированию с проверкой онлайн
- Сложность
- Сложная
- Языки
- 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