CAR - Lập lịch sửa chữa ô tô

Tác giả: ll931110

Ngôn ngữ: Pascal

{$MODE DELPHI}
const
  InputFile  = '';
  OutputFile = '';
  max = 10000;
var
  a, b, Index: array[1..max] of Integer;
  n: Integer;
  Res: Comp;

procedure Enter;
var
  f: Text;
  i: Integer;
begin
  Assign(f, InputFile); Reset(f);
  Readln(f, n);
  for i := 1 to n do Read(f, a[i]);
  Readln(f);
  for i := 1 to n do Read(f, b[i]);
  Close(f);
end;

procedure Init;
var
  i: Integer;
begin
  for i := 1 to n do Index[i] := i;
end;

function Lower(i, j: Integer): Boolean; {= a[i]/b[i] > a[j]/b[j]}
begin
  Lower := LongInt(a[i]) * b[j] > LongInt(a[j]) * b[i];
end;

procedure QSort(L, H: Integer);
var
  k, i, j, t: Integer;
begin
  if L >= H then Exit;
  k := Index[Random(H - L + 1) + L];
  i := L; j := H;
  repeat
    while Lower(Index[i], k) do Inc(i);
    while Lower(k, Index[j]) do Dec(j);
    if i <= j then
      begin
        t := Index[i]; Index[i] := Index[j]; Index[j] := t;
        Inc(i); Dec(j);
      end;
  until i > j;
  QSort(L, j); QSort(i, H);
end;

procedure Solve;
var
  t: LongInt;
  i, j: Integer;
begin
  t := 0; Res := 0;
  for i := 1 to n do
    begin
      j := Index[i];
      t := t + b[j];
      Res := Res + a[j] * (t + 0.0);
    end;
end;

procedure Result;
var
  f: Text;
  i: Integer;
begin
  Assign(f, OutputFile); Rewrite(f);
  Writeln(f, Res:0:0);
  for i := 1 to n do  Write(f, Index[i], ' ');
  Close(f);
end;

begin
  Enter;
  Init;
  QSort(1, n);
  Solve;
  Result;
end.
2
1 1
1 2

Download