Cod sursa(job #253978)

Utilizator punkistBarbulescu Dan punkist Data 6 februarie 2009 13:58:31
Problema Caramizi Scor 5
Compilator fpc Status done
Runda Stelele Informaticii 2009, clasele 9-10, ziua 1 Marime 1.81 kb
var j,etmax,Ana,tpos,k,h,tf,n,m,i,a,lung:longint;
    f,f2:text;
    c,c2:array[1..200000] of longint;
    cmax,cf:int64;
    gasit:boolean;

procedure QuickSort(l,r: integer);
var
  i,j,x,y: integer;
begin
  i:=l; j:=r; x:=c[(l+r) DIV 2];
  repeat
    while c[i]<x do i:=i+1;
    while x<c[j] do j:=j-1;
    if i<=j then
    begin
      y:=c[i]; c[i]:=c[j]; c[j]:=y;
      i:=i+1; j:=j-1;
    end;
  until i>j;
  if l<j then QuickSort(l,j);
  if i<r then QuickSort(i,r);
end;


procedure QuickSort2(l,r: integer);
var
  i,j,x,y: integer;
begin
  i:=l; j:=r; x:=c2[(l+r) DIV 2];
  repeat
    while c2[i]<x do i:=i+1;
    while x<c2[j] do j:=j-1;
    if i<=j then
    begin
      y:=c2[i]; c2[i]:=c2[j]; c2[j]:=y;
      i:=i+1; j:=j-1;
    end;
  until i>j;
  if l<j then QuickSort2(l,j);
  if i<r then QuickSort2(i,r);
end;

begin
assign(f,'caramizi.in');
assign(f2,'caramizi.out');
reset(f);
rewrite(f2);
readln(f,n,m);
for i:=1 to n do
 begin
  read(f,c[i]);
 end;
Quicksort(1,n);
cmax:=0;
i:=1;
while i<=m do
 begin
  read(f,a);
  cmax:=0;
  for h:=n downto 1 do
   begin
    for j:=1 to n do c2[j]:=c[j];
    tf:=0;
    lung:=n;
    while lung>=h do
     begin
      tf:=tf+c2[lung-h+1];
      for j:=lung-h+2 to lung do
       begin
        c2[j]:=c2[j]-c2[lung-h+1];
       end;
      c2[lung-h+1]:=0;
      while (c2[lung-h+1]=0) and (lung>=h) do
       begin
        for k:=lung-h+1 to lung do
         begin
          c2[k]:=c2[k+1];
         end;
        lung:=lung-1;
       end;
      Quicksort2(1,lung);
     end;
    if tf>=a then
     begin
      cf:=a*h;
      cmax:=cf;
      break;
     end
    else
     begin
      cf:=tf*h;
      if cf>cmax then cmax:=cf;
     end;
   end;
  writeln(f2,cmax);
  i:=i+1;
 end;
close(f);
close(f2);
end.