Cod sursa(job #42166)

Utilizator fc_oni_cu_50_pctAnul asta in play-out fc_oni_cu_50_pct Data 28 martie 2007 21:43:01
Problema Shop Scor 60
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.67 kb
program shop;
type vect=array[1..30] of longint;
var poz,a,b,use:vect;
    f,g:text;
    n,sum,c,i,prod,q,total:longint;
{}
procedure Sort(l, r: Integer);
var
  i, j, x, y: integer;
begin
  i := l; j := r; x := a[(l+r) DIV 2];
  repeat
    while a[i] < x do i := i + 1;
    while x < a[j] do j := j - 1;
    if i <= j then
    begin
      y := a[i]; a[i] := a[j]; a[j] := y;
      y := b[i]; b[i] := b[j]; b[j] := y;
      y := poz[i]; poz[i] := poz[j]; poz[j] := y;
      i := i + 1; j := j - 1;
    end;
  until i > j;
  if l < j then Sort(l, j);
  if i < r then Sort(i, r);
end;
{}
procedure citire;
begin
assign(f,'shop.in'); reset(f);
assign(g,'shop.out'); rewrite(g);
read(f,n,c,sum);
for i:=1 to n do begin read(f,a[i],b[i]);
                       poz[i]:=i;
                       end;
end;
{}
begin
citire;
sort(1,n);
total:=0;
for i:=n downto 1 do begin
            prod:=1;
            for q:=1 to a[i] do prod:=prod*c;  {1 moneda}
            if b[i]<sum div prod then begin
                                      use[poz[i]]:=b[i];
                                      sum:=sum-b[i]*prod;
                                      total:=total+use[poz[i]];
                                      end
                                      else  begin
                                      use[poz[i]]:=sum div prod;
                                      sum:=sum-use[poz[i]]*prod;
                                      total:=total+use[poz[i]];
                                      end;
            if sum=0 then break;
            end;
writeln(g,total);
for i:=1 to n-1 do write(g,use[i],' ');
writeln(g,use[n],' ');
close(f); close(g);
end.