Пул задач с зависимостями
Задача по программированию с проверкой онлайн
- Сложность
- Сложная
- Языки
- Python
- JavaScript
- TypeScript
- Темы
- Асинхронность и потоки
- Деревья и графы
Задание — асинхронная функция без аргументов: вызовите её (await job()), чтобы выполнить его; оно может завершиться ошибкой (исключением).
Дан список заданий jobs, список зависимостей deps той же длины и целое limit ≥ 1. Задание i можно запустить, когда все задания с индексами из deps[i] успешно завершились (если deps[i] пуст — сразу). Одновременно выполняется не больше limit заданий. Свободное место всегда занимает готовое к запуску задание с наименьшим индексом. Задание, у которого хотя бы одна зависимость завершилась ошибкой (или сама никогда не запустится), не запускается никогда.
Если несколько заданий завершаются в один и тот же момент, сначала учтите их все (их успехи открывают новые задания), а потом заполняйте освободившиеся места. Каждое задание длится не меньше 1 мс. В deps нет циклов, повторов и ссылок задания на себя; индексы — от 0 до n − 1, до 30 заданий.
Верните индексы всех запущенных заданий — и успешных, и завершившихся ошибкой — в порядке завершения; при равном моменте — по возрастанию индекса. Для пустого списка ответ [].
Пример: задания (30 мс → 1), (10 мс → 2), (10 мс → ошибка), (5 мс → 4), (1 мс → 5); deps = [[], [], [1], [0, 1], [2]], limit = 2 → [1, 2, 0, 3] (задание 4 зависит от упавшего задания 2 и не запускается).
Источник: задача CodeShare