Cod sursa(job #222836)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 25 noiembrie 2008 18:25:46
Problema Garaj Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.54 kb
type vec=array[0..100010]of integer;

var f,g:text;
    a,b,r:int64;
    c,t:vec;
    v:array[0..100010]of int64;
    n,m,i,k:longint;


function verif(k:int64):boolean;
var s:int64;
    i:longint;
begin
  s:=0;
  i:=1;
  while (s<m)and(i<=n)do
    begin
      s:=s+(k div (2*t[i]))*c[i];
      inc(i);
    end;
  if (s>=m)then verif:=true else verif:=false;
end;


function search(a,b:int64):int64;
var k,r:int64;
begin
  while (a<=b)do
    begin
      k:=(a+b)div 2;
      if (verif(k))then
        begin
          r:=k;
          b:=k-1;
        end else a:=k+1;
    end;
  search:=r;
end;

procedure quick(l,r:longint);
var i,j,x:longint;
    aux:int64;
begin
i:=l;
j:=r;
x:=v[(i+j)div 2];
repeat
        while (v[i]>x)do inc(i);
        while (v[j]<x)do dec(j);
        if (i<=j)then
          begin
            aux:=v[i];
            v[i]:=v[j];
            v[j]:=aux;
            inc(i);
            dec(j);
          end;
        until i>j;
if (l<j)then quick(l,j);
if (i<r)then quick(i,r);
end;

begin
assign(f,'garaj.in');
assign(g,'garaj.out');
reset(f);
rewrite(g);
read(f,n,m);
a:=1000;
for i:=1 to n do
  begin
    read(f,c[i],t[i]);
    if (m mod c[i]=0)then k:=0 else k:=1;
    if ((m div c[i]+k)*t[i]>b)then b:=t[i]*(m div c[i]+k);
    if (t[i]<a)then a:=t[i];
  end;
r:=search(a,2*b);
for i:=1 to n do
  v[i]:=(r div (2*t[i]))*c[i];
quick(1,n);
a:=0;
i:=1;
while (a<=m)and(i<=n)do
  begin
    inc(a,v[i]);
    inc(i);
  end;
write(g,r,' ',i-1);
close(f);
close(g);
end.