Ну вот, получИте:
Код:
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. Вкратце - алгоритм. В каждой записи вычисляется "локальная" производительность, как доход/кол-во рабочих. При каждом прохождении цикла отсева находится номер записи с минимальным значением "локальной" производительности, этот номер вносится в "черный список" и из нового расчета общей производительности исключается.