Cod sursa(job #42632)

Utilizator petrePajarcu Alexandru-Petrisor petre Data 29 martie 2007 13:02:54
Problema Energii Scor 65
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.42 kb
var f,g:text;
a,b:array[1..1024] of longint;
sum,ind:array[1..200000] of longint;
n,i,j,k,l,m,s,max,min:longint;
procedure Sort(l, r: longint);
var
  i, j, x, y: longint;
begin
  i := l; j := r; x := b[(l+r) DIV 2];
  repeat
    while b[i] < x do i := i + 1;
    while x < b[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;
      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;

begin
assign(f,'energii.in');
assign(g,'energii.out');
reset(F);
rewrite(G);
readln(f,n);
readln(f,s);
max:=0;
for i:=1 to n do
        begin
        readln(f,a[i],b[i]);
        if a[i]>max then max:=a[i];
        end;
sort(1,n);
for i:=1 to n do
begin
if (sum[a[i]]=0) then
            begin
            sum[a[i]]:=b[i];
            ind[a[i]]:=i;
            end;
        for j:=1 to s-1 do
        if (sum[j]<>0) and(ind[j]<>i)and((sum[a[i]+j]>sum[j]+b[i])or(sum[a[i]+j]=0))
                then
                begin
                sum[a[i]+j]:=sum[j]+b[i];
                ind[a[i]+j]:=i;
                end;
end;
min:=maxlongint;
for i:=s to s+max-1 do
        if (sum[i]<>0) and (sum[i]<min) then
                                      min:=sum[i];
if min=maxlongint then
                       writeln(g,-1)

else
writeln(g,min);
close(F);
close(G);
end.