Cod sursa(job #37732)

Utilizator vanila0406Ionescu Victor vanila0406 Data 25 martie 2007 12:15:43
Problema Shop Scor 100
Compilator fpc Status done
Runda preONI 2007, Runda 4, Clasa a 9-a si gimnaziu Marime 4.18 kb
program shop;
var f,g:text;
        n:qword;
        v:array[1..31] of qword;
        c:array[1..31] of qword;
        b,vmin:array[1..31] of qword;
        poz:array[1..31] of byte;
        l:qword;
        af,p,j,i:longint;
        min:qword;





procedure iofile;
var i,j:longint;
        x:longint;
        p:qword;
begin
        assign(f,'shop.in');
        reset(f);
        assign(g,'shop.out');
        rewrite(g);
        readln(f,n,af,l);
        for i:=1 to n do
                begin
                        readln(f,x,c[i]);
                        p:=1;
                        for j:=1 to x do
                                p:=p*af;
                        v[i]:=p;
                        poz[i]:=i;
                end;
        close(f);
end;



procedure afis;
var s:qword;
        i,j,p:longint;
begin
     s:=0;
     for i:=1 to n do
        s:=s+b[i];
     if s<min then
        begin
                min:=s;
                vmin:=b;
        end;

end;






procedure pozitie(var m:longint;p,u:longint);
var i,j,di,dj,aux:longint;
        aux1:qword;
begin
        i:=p;
        j:=u;
        di:=0;
        dj:=-1;
        while i<j do
                begin
                        if v[i]<v[j] then
                                begin
                                        aux:=di;
                                        di:=-dj;
                                        dj:=-aux;
                                        aux:=poz[i];
                                        poz[i]:=poz[j];
                                        poz[j]:=aux;
                                        aux1:=c[i];
                                        c[i]:=c[j];
                                        c[j]:=aux1;
                                        aux1:=v[i];
                                        v[i]:=v[j];
                                        v[j]:=aux1;
                                end;
                        i:=i+di;
                        j:=j+dj;
                end;
        m:=i;
end;




procedure quick(p,u:longint);
var m:longint;
begin
        if p<u then
                begin
                        pozitie(m,p,u);
                        quick(p,m-1);
                        quick(m+1,u);
                end;
end;


{procedure prel(k:longint;s:qword);
var  i:qword;
        p,min:qword;
begin
        if k=n+1 then
                begin
                        if s=0 then
                                begin
                                        afis;
                                end;
                end else
                begin
                        p:=0;
                        min:=s div v[k];
                        if c[k]<min then min:=c[k];
                        i:=min+1;
                        while i>0 do
                                begin
                                        dec(i);
                                        p:=i*v[k];
                                        c[k]:=c[k]-i;
                                        b[k]:=b[k]+i;
                                        prel(k+1,s-p);
                                        c[k]:=c[k]+i;
                                        b[k]:=b[k]-i;
                                end;
                end;
end; }


procedure greedy;
var i:longint;
        s,min:qword;
begin
     s:=l;
     for i:=1 to n do
         begin
                min:=s div v[i];
                if c[i]<min then
                        min:=c[i];
                b[i]:=min;
                s:=s-min*v[i];
         end;
end;




begin
        iofile;
        quick(1,n);
        fillchar(b,sizeof(b),0);
        {prel(1,l);}
        greedy;
        min:=0;
        for i:=1 to n do
                min:=min+b[i];
        writeln(g,min);
     for i:=1 to n do
        begin
                for j:=1 to n do
                        if poz[j]=i then
                                begin
                                        p:=j;
                                        break;
                                end;
                write(g,b[p],' ');
        end;
     close(g);
end.