PSumCi — различия между версиями
| Строка 4: | Строка 4: | ||
}} | }} | ||
| − | == Идея == | + | == Описание алгоритма == |
| + | === Идея === | ||
Пусть <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} = \dfrac{k}{m}</tex>. Тогда в оптимальном расписании работа с номером <tex>i</tex> будет выполнена на станке <tex>i \bmod m</tex>, <tex>b_{i}</tex>-ой с конца. | ||
| + | |||
| + | === Псевдокод === | ||
| + | |||
| + | list<int> schedule[m] <font color=green> //Заведём список работ для каждого станка. Ответ будет храниться в нём.</font> | ||
| + | '''for''' i = 0 '''to''' n | ||
| + | schedule[i mod m].push(i) <font color=green>//ставим работу с номером i на станок i mod m в конец.</font><br> | ||
| + | <font color=green>//Заметим что расписание для каждого станка получилось перевёрнутым<br> //Поэтому развернём расписание для каждого станка.</font> | ||
| + | '''for''' i = 0 '''to''' m | ||
| + | schedule[i].reverse() | ||
Версия 19:16, 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()