Показать сообщение отдельно
Старый 17.02.2014, 21:02   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Ну вот, получИте:
Код:
Type
 Prod=Record
       N:Byte;
       Num,Prime,Price,Work:Integer;
       Productivity_Local:Real;
      End;

Var
 Prd:Array[1..20] of Prod;
 Bad:Set of Byte;
 Productivity_Initial,Min,Max,Productivity_Current:Real;
 f:Text;
 i,Im,k:Integer;

Function Productivity:Real;
var
 j:Integer;
 Sum,Sum_Work:Real;
begin
 Sum:=0;
 Sum_Work:=0;
 for j:=1 to 20 do
  with Prd[j] do
   If Not(N in Bad) then
    begin
     Sum:=Sum+(Price-Prime)*Num;
     Sum_Work:=Sum_Work+Work;
    end;
 Productivity:=Sum/Sum_Work;
end;

Begin
 Bad:=[];
 Assign(f,'D:\Data.txt');
 Reset(f);
 For i:=1 to 20 do
  with Prd[i] do
   begin
    Readln(f, N,Num,Prime,Price,Work);
    Productivity_Local:=(Price-Prime)*Num/Work;
   end;
 Close(f);
 Productivity_Initial:=Productivity;
 Max:=Prd[1].Productivity_Local;
 For i:=2 to 20 do
  If Prd[i].Productivity_Local>Max then Max:=Prd[i].Productivity_Local;
 k:=0;
 Repeat
  Inc(k);
  Min:=Max;
  For i:=1 to 20 do
   If Not(i in Bad) and (Prd[i].Productivity_Local<Min) then
    begin
     Min:=Prd[i].Productivity_Local;
     Im:=i;
    end;
  Bad:=Bad+[Im];
  Productivity_Current:=Productivity;
 Until (Productivity_Current>=Productivity_Initial*2) or (k=20);
 Write('The plant must refuse from the positions:');
 For i:=1 to 20 do
  if i in Bad then Write(i:3);
 Writeln;
 Writeln('Inial productivity: ',Productivity_Initial:0:3);
 Writeln('Final productivity: ',Productivity_Current:0:3);
 Readln;
End.
Несколько пояснений:
1. Исходные данные помещены в файл по имени Data.txt (прилагается). У меня он расположен на диске D, так что поправьте путь в программе, если надо. Колонки: порядковый номер, количество изделий (напр. в год), себестоимость, цена, количество рабочих.
2. Программа писалась и отлаживалась в НОРМАЛЬНОМ Паскале (Free). За глюки этого богомерзкого АВС не отвечаю!
3. Вкратце - алгоритм. В каждой записи вычисляется "локальная" производительность, как доход/кол-во рабочих. При каждом прохождении цикла отсева находится номер записи с минимальным значением "локальной" производительности, этот номер вносится в "черный список" и из нового расчета общей производительности исключается.
Вложения
Тип файла: txt Data.txt (379 байт, 494 просмотров)
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070