Cod sursa(job #72298)

Utilizator mlazariLazari Mihai mlazari Data 13 iulie 2007 12:48:11
Problema Loto Scor 50
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.91 kb
Program Loto;
var N : integer;
    lot : array[0..100] of longint;
    S,Sum : longint;
    answer : array[0..6] of integer;
    possible : boolean;

procedure Citeste;
var Intrare : text;
    i : integer;
begin
  assign(Intrare,'loto.in');
  reset(Intrare);
  readln(Intrare,N,S);
  lot[0]:=0;
  for i:=1 to N do read(Intrare,lot[i]);
  close(Intrare);
end;

procedure Calc;
var i : integer;
    negasit : boolean;
begin
  if (S<lot[1]*6) or (S>lot[N]*6) then possible:=false
   else
    begin
      i:=1;
      answer[1]:=0;
      Sum:=0;
      negasit:=true;
      while possible and negasit do
       begin
         if answer[i]=N then
          begin
            if i=1 then possible:=false
             else
              begin
                Sum:=Sum-lot[answer[i]];
                i:=i-1;
              end;
          end
          else
           begin
             answer[i]:=answer[i]+1;
             Sum:=Sum+lot[answer[i]];
             if answer[i]>answer[i-1] then Sum:=Sum-lot[answer[i]-1];
             if i<6 then
              if lot[N]*(6-i)>=S-Sum then
               begin
                 i:=i+1;
                 answer[i]:=answer[i-1]-1;
               end;
           end;
         negasit:=(S<>Sum) or (i<6) or (answer[N]<answer[N-1]);
       end;
    end;
end;

procedure Calculeaza;
var i,j,imin : integer;
    aux : longint;
begin
  possible:=true;
  answer[0]:=1;
  for i:=1 to N-1 do
   begin
     imin:=i;
     for j:=i+1 to N do
      if lot[j]<lot[imin] then imin:=j;
     aux:=lot[i];
     lot[i]:=lot[imin];
     lot[imin]:=aux;
   end;
  Calc;
end;

procedure Scrie;
var Iesire : text;
    i : integer;
begin
  assign(Iesire,'loto.out');
  rewrite(Iesire);
  if possible then
   for i:=1 to 6 do write(Iesire,lot[answer[i]],' ')
   else write(Iesire,-1);
  close(Iesire);
end;

begin
  Citeste;
  Calculeaza;
  Scrie;
end.