IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> help! равномерное распределение работ
collapse
сообщение 9.10.2003 10:04
Сообщение #1





Группа: Пользователи
Сообщений: 3

Репутация: -  0  +


задача: есть предприятие. m видов работ, n месяцев. работы неделимы. трудоёмкости у каждой работы соотв-но b[i]. надо более или менее равномерно распределить работы по месяцам так, чтобы максимальная напряженность месяца была минимальной из всех возможных, т.е. max (суммаb[i]) ->min
(сумма b[i] - напряженность какого-то месяца)
n>6; m>20

помогите написать прогу. или хотя бы алгоритм. а то меня застопорило..
писать можно но паскали или с++.
буду очень признательна.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
trminator
сообщение 11.10.2003 14:27
Сообщение #2


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Посылаю еще раз, вчера были глюки, не прислалось
Код

program workplan;
{$APPTYPE CONSOLE}
uses
 SysUtils;
const inf = 1000000; //infinity

type TVect = array[1..100] of Integer;
    TPlan = array[-1..100,1..100] of Integer;

var works   : TVect;
   plan    : TPlan;
   n, m, i : integer;  //n days, m works
   k,c, avail:integer;  //avail works left

function argmin: integer;
var i, min, nmin: integer;
begin min:=inf;
 for i:=1 to n do
   if plan[-1, i] < min then
     begin min:=plan[-1, i]; nmin:=i end;
 Result:=nmin;
end;

procedure swap(var a, b: integer);
var c: integer;
begin
 c:=a; a:=b; b:=c
end;

procedure sort(var a: TVect; n: integer);
var i, j: integer;
begin
 for i:=1 to n do
   for j:=n downto i do
     if a[i] > a[j] then swap(a[i], a[j]);
end;

procedure input;
var i: integer;
begin
  WriteLn('Input number of days > ');
  ReadLn(n);
  WriteLn('Input number of works > ');
  ReadLn(m);
  for i:=1 to m do
    begin
      Write('Input cost for work # ',i,' > ');
      ReadLn(works[i])
    end;
end;

procedure output;
var i, j: integer;
begin
 WriteLn('-------------------------');
 for i:=1 to n do
   begin
     for j:=1 to plan[0, i] do write(plan[j, i], ' ');
     writeLn('Total: ', plan[-1, i])
   end;
end;

begin
 input; avail:=m;
 sort(works, m);
 fillchar(plan, sizeof(plan), 0);
 for i:=1 to m do
   begin
      k:=argmin;
      c:=works[avail];
      inc(plan[-1, k],c);
      inc(plan[0, k]);
      plan[plan[0,k], k]:=c;
      dec(avail)
   end;
 output;
 Readln;
end.

ЗЫ Сдавалась в ПетрГУ, Комбинаторные алгоритмы, Касьянову, на этой неделе.
(просто есть подозрение, что эта прога пойдет туда же smile.gif)


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 26.07.2025 22:13
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"