1632
правки
Изменения
1p1sumu
,rollbackEdits.php mass rollback
==Алгоритм==
'''for''' i = 1 '''to''' n '''do'''
d[i] = min{(d[i], n}) Сортиуем d подсчетом
'''for''' i = 1 '''to''' n '''do'''
'''if''' time < d[i]
S = S <tex>\cup</tex> {i}
time <code>+=</code> 1 '''return''' S Во избежание лишнего копирования массивов, мы можем делать проход по массиву блоков (bucket'ов) и для каждого блока проходить по спискам работ внутри него. Начальное значение <tex> time = 0</tex>. После рассмотрения очередной работы мы будем добавлять ее в расписание и увеличивать <tex> time</tex> на <tex>1</tex>. Тогда, если значение <tex> time</tex> становится равным номеру блока, то мы переходим к следующему блоку, а нерассмотренные задачи помечаем как просроченные и выполняем в конце. Работы с <tex>d_i = 0</tex> заранее отметим как просроченные. ===Время работы===Cортировку работ по неубыванию дедлайнов осуществляем с помощью карманной сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>. Во время сортировки стоит учитывать===Корректность и оптимальность===В результате выполнения данного алгоритма будет получено корректное расписание, что дедлайны могут значительно превосходить количество задачв котором каждая работа встречается не более одного раза. В таком случае необходимо предварительно пересчитать дедлайны по формуле <tex>d_i = \min\{d_iВначале расписания будут стоять все работы, n\}</tex> (в оптимальном расписании которые мы не выполняем успеваем выполнить до дедлайна. Остальные работы позже времени <tex>t=n</tex>)дописываются в конец в произвольном порядке.
== См. также ==