Cod sursa(job #5665)

Utilizator andreea22andreea georgescu andreea22 Data 13 ianuarie 2007 18:21:42
Problema Energii Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.94 kb
var f:text;
    n,w,i,cost,poz,k:integer;
    e,c,p:array[1..100] of integer;
    optim:boolean;
procedure q_sort(st,dr:integer);
  var i,j,aux:integer;
  begin i:=st;j:=dr;
        while i<>j do
    begin if ((i-j)*(c[i]/e[i]-c[j]/e[j])<0)or((c[i]/e[i]=c[j]/e[j])and
             ((i-j)*(e[i]-e[j])>0)) then
             begin aux:=c[i];c[i]:=c[j];c[j]:=aux;
                   aux:=e[i];e[i]:=e[j];e[j]:=aux;
                   aux:=i;i:=j;j:=aux;
             end;
          j:=j+abs(i-j) div (i-j);
    end;
        if i>2 then q_sort(st,i-1);
        if i<n-1 then q_sort(i+1,dr);
  end;
procedure back(k,w1,c1:integer);
  var i,x:integer;
  begin if (not optim)and(w1>=w) then
            begin if c1<cost then cost:=c1;
                  if w1=w then optim:=true;
            end;
        if not optim then
    begin x:=p[k];
          if x>0 then begin w1:=w1-e[x];c1:=c1-c[x];end
          else if w1<w then x:=p[k-1]
          else x:=n;
          for i:=x+1 to n do if not optim then
            if (c1+c[i])/(w1+e[i])<=cost/w then
              begin p[k]:=i;back(k+1,w1+e[i],c1+c[i]);end
            else optim:=true;
    end;
        if (not optim)and(k<=poz) then
          begin p[k]:=0;back(k-1,w1,c1);end;
  end;
procedure greedy(k,w1,c1:integer);
  var i:integer;
  begin for i:=p[k-1]+1 to n do if not optim then
          if w1+e[i]<w then
            begin p[k]:=i;greedy(k+1,w1+e[i],c1+c[i]);break;
            end
          else if w1+e[i]=w then
            begin optim:=true;cost:=c1+c[i];
            end
          else begin cost:=c1+c[i];p[k]:=i;poz:=i;
                     back(k,w1+e[i],cost);break;
               end
                               else break;

  end;
begin assign(f,'energii.in');reset(f);read(f,n,w);
      for i:=1 to n do readln(f,e[i],c[i]);
      close(f);
      q_sort(1,n);
      greedy(1,0,0);
      assign(f,'energii.out');rewrite(f);writeln(f,cost);close(f);
end.