PSumCi — различия между версиями
(→Описание алгоритма) |
(→Идея) |
||
Строка 6: | Строка 6: | ||
== Описание алгоритма == | == Описание алгоритма == | ||
=== Идея === | === Идея === | ||
− | Пусть <tex>p_{i}</tex> заданы в порядке невозрастания (<tex>p_{1} \geqslant p_{2} \geqslant \ldots \geqslant p_{n} </tex>). Пусть теперь <tex>b_{k} = \dfrac{k}{m}</tex>. Тогда в оптимальном расписании работа с номером <tex>i</tex> будет выполнена на станке <tex>i \bmod m</tex>, <tex>b_{i}</tex>-ой с конца. | + | Пусть <tex>p_{i}</tex> заданы в порядке невозрастания (<tex>p_{1} \geqslant p_{2} \geqslant \ldots \geqslant p_{n} </tex>). Пусть теперь <tex>b_{k} = \left\lceil\dfrac{k}{m}\right\rceil</tex>. Тогда в оптимальном расписании работа с номером <tex>i</tex> будет выполнена на станке <tex>i \bmod m</tex>, <tex>b_{i}</tex>-ой с конца. |
=== Псевдокод === | === Псевдокод === |
Версия 19:22, 4 июня 2016
Задача: |
Дано Цель — составить такое расписание, чтобы суммарное время окончания всех работ было минимальным. | работ с заданными временами выполнения . И параллельных станков с одинаковой скоростью выполнения работ.
Описание алгоритма
Идея
Пусть
заданы в порядке невозрастания ( ). Пусть теперь . Тогда в оптимальном расписании работа с номером будет выполнена на станке , -ой с конца.Псевдокод
list<int> schedule[m] //Заведём список работ для каждого станка. Ответ будет храниться в нём. for i = 0 to n schedule[i mod m].push(i) //ставим работу с номером i на станок i mod m в конец.
//Заметим что расписание для каждого станка получилось перевёрнутым
//Поэтому развернём расписание для каждого станка. for i = 0 to m schedule[i].reverse()
Ассимптотика
Так как нам понадобится сортировка для массива
, то итоговая ассимптотика будет .