Cod sursa(job #137542)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 17 februarie 2008 12:36:37
Problema Garaj Scor 40
Compilator fpc Status done
Runda preONI 2008, Runda 4, Clasa a 9-a Marime 3.12 kb
program garaj;
var f,g:text;
        c,t:array[1..100001] of longint;
        n,tmin,nrmin,dim:longint;
        m:qword;
        cat:array[1..100001] of qword;
        id:array[1..100001] of longint;



procedure iofile;
var i:longint;
begin
        assign(f,'garaj.in');reset(f);
        assign(g,'garaj.out');rewrite(g);
        readln(f,n,m);
        for i:=1 to n do
                begin
                readln(f,c[i],t[i]);
                id[i]:=i;
        end;
        close(f);
end;



function cate_max(x,timp:qword):qword;
begin
        cate_max:=(timp div (2*t[x]))*c[x];
end;


function se_poate(t:longint):boolean;
var i:longint;
        s:qword;
begin
        s:=0;
        for i:=1 to n do
                begin
                        s:=s+cate_max(i,t);
                end;
        if s>=m then se_poate:=true else
                se_poate:=false;
end;



procedure cbin(p,u:longint);
var m:longint;
begin
        if p<=u then
                begin
                        m:=(p+u) div 2;
                        if se_poate(m) then
                                begin
                                        tmin:=m;
                                        cbin(p,m-1);
                                end else
                                cbin(m+1,u);
                end;
end;


procedure repair(i:longint);
var l,r,min:longint;
        aux:qword;
begin
        l:=i*2;
        r:=l+1;
        min:=i;
        if (l<=dim)and(cat[l]<cat[min]) then min:=l;
        if (r<=dim)and(cat[r]<cat[min]) then min:=r;
        if min<>i then
                begin
                        aux:=cat[i];
                        cat[i]:=cat[min];
                        cat[min]:=aux;
                        aux:=id[i];
                        id[i]:=id[min];
                        id[min]:=aux;
                        repair(min);
                end;
end;


procedure build_heap;
var i:longint;
begin
        for i:=n downto 2 do
                repair(i);
end;


procedure heapsort;
var i:longint;
        aux:qword;
begin
        build_heap;
        for i:=n downto 2 do
                begin
                        aux:=cat[i];
                        cat[i]:=cat[1];
                        cat[1]:=aux;
                        aux:=id[i];
                        id[i]:=id[1];
                        id[1]:=aux;
                        dec(dim);
                        repair(1);
                end;
end;




procedure solve;
var i:longint;
        sc:longint;
begin
        sc:=m;
        tmin:=maxlongint;
        cbin(1,maxlongint-5);
        for i:=1 to n do
                cat[i]:=cate_max(i,tmin);
        dim:=n;
        heapsort;
        nrmin:=0;
        while sc>0 do
                begin
                        inc(nrmin);
                        if sc>cate_max(id[nrmin],tmin) then
                                sc:=sc-cate_max(id[nrmin],tmin) else
                                sc:=0;
                end;
        writeln(g,tmin,' ',nrmin);
        close(g);
end;


begin
        iofile;
        solve;
end.