Cod sursa(job #30582)

Utilizator adalLica Adela adal Data 14 martie 2007 17:25:59
Problema Ghiozdan Scor 0
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.45 kb
program ghiozdan;
type rec=record
  s,nr,xx:longint;
  d:byte;
end;

var a,c:array[0..20000] of integer;
    b:array[0..75000] of rec;
    f,g:text; m,poz,n,max1,max,mx,i,j,k:longint;
procedure interclas(st,m,dr:longint);
var i,j,k,t:longint;
begin
  for i:=st to dr do
  c[i]:=a[i];
  i:=st; k:=st; j:=m+1;
  while (i<=m) and(j<=dr) do
    if c[i]>c[j] then begin a[k]:=c[i]; inc(k); inc(i); end
                 else begin a[k]:=c[j]; inc(k); inc(j); end;
  for t:=i to m do begin
    a[k]:=c[t]; inc(k);
  end;
  for t:=j to dr do begin
    a[k]:=c[t]; inc(k);
  end;
end;

procedure mergesort(st,dr:longint);
var m:longint;
begin
  if st<>dr then begin
    m:=(st+dr) div 2;
    mergesort(st,m);
    mergesort(m+1,dr);
    interclas(st,m,dr);
  end;
end;

procedure afis(i:longint);
begin
  if i>0 then begin
    afis(b[i].d);
    writeln(g,b[i].xx);
  end;
end;
begin
 assign(f,'ghiozdan.in'); reset(f);
 assign(g,'ghiozdan.out'); rewrite(g);
 readln(f,n,mx);
 for i:=1 to n do read(f,a[i]);
 mergesort(1,n);
 b[1].s:=a[1]; max:=1; b[1].d:=0; b[1].nr:=1;  b[1].xx:=a[1];
 for i:=2 to n do
   for j:=max downto 1 do
     if (b[j].s+a[i]<=mx) then begin
       b[max+1].s:=b[j].s+a[i];  b[max+1].d:=j;
       b[max+1].xx:=a[i]; b[max+1].nr:=b[j].nr+1;
       if b[j].s+a[i]>max1 then begin poz:=j+1; max1:=b[j].s+a[i]; end;
       inc(max);
     end;
  writeln(g,max1,' ',b[poz].nr);
  afis(poz);
close(f); close(g);
end.