With async/await you can start several tasks and let them run at the same time. A SemaphoreSlim often caps how many run at once.
Tasks numbered 0 to n − 1 take durations[i] time units. At time 0 start as many tasks as the limit allows, in index order. Whenever tasks finish, record them (if several finish at the same moment, lower index first) and immediately start the next waiting tasks, in index order, to fill the free slots.
Implement parallel_task_order(durations, limit).
Вход
durations: Сколько времени занимает каждая задача.
limit: Максимальное число задач, выполняющихся одновременно.
Выход
Верните индексы задач в порядке их завершения.
Ограничения
1 ≤ n ≤ 100,000
1 ≤ durations[i] ≤ 10^6; 1 ≤ limit ≤ n
Примеры
Ввод:
limit = 2
durations = [4, 2, 3, 1]
Ожидаемый вывод:
expected = [1, 0, 2, 3]
Ввод:
long long limit = 2;
std::vector<long long> durations = {4, 2, 3, 1};
Ожидаемый вывод:
std::vector<long long> expected = {1, 0, 2, 3};
Ввод:
long limit = 2;
long[] durations = new long[] {4, 2, 3, 1};
Ожидаемый вывод:
long[] expected = new long[] {1, 0, 2, 3};
Пояснение
Запускаются задачи 0 и 1. Задача 1 завершается в момент 2, стартует задача 2 (завершится в 5). Задача 0 завершается в 4, стартует задача 3 (завершится в 5). Задачи 2 и 3 завершаются одновременно, меньший номер первым: [1, 0, 2, 3].
Ввод:
limit = 3
durations = [3, 1, 2]
Ожидаемый вывод:
expected = [1, 2, 0]
Ввод:
long long limit = 3;
std::vector<long long> durations = {3, 1, 2};
Ожидаемый вывод:
std::vector<long long> expected = {1, 2, 0};
Ввод:
long limit = 3;
long[] durations = new long[] {3, 1, 2};
Ожидаемый вывод:
long[] expected = new long[] {1, 2, 0};
Пояснение
Все задачи идут одновременно и завершаются в моменты 1, 2 и 3: [1, 2, 0].
Как подступиться
Сначала попробуйте сами, затем открывайте подсказки по одной.
Подсказка 1
Держите выполняющиеся задачи упорядоченными по времени завершения, затем по номеру.
Подсказка 2
На каждом шаге переходите к следующему времени завершения и собирайте все задачи, закончившиеся в этот момент.
Подсказка 3
Заполняйте освободившиеся места следующими ожидающими задачами по порядку номеров.
Ожидаемая сложность
время O(n log limit), доп. память O(limit)
Ссылки
Это задание адаптировано для CodeUtility. Следуйте условию и ограничениям выше.