Cod sursa(job #250149)

Utilizator chelaru_t_achelaru traian andrei chelaru_t_a Data 30 ianuarie 2009 11:43:11
Problema Semne Scor 20
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.47 kb
type semne=record
           n:longint;
           s:char;
           end;
var i,n,s,ss,p:longint;
    v:array [1..50000] of semne;
    f,g:text;

 procedure citire;
  var i:integer;
  begin
   readln(f,n,s);
   for i:=1 to n do read(f,v[i].n);
  end;

 procedure minus;
  var i,p1,m,min:longint;
  begin
   min:=s-(ss-2*v[1].n);
   v[1].s:='-';
   if min<0 then min:=-min;
   p1:=1;
   for i:=2 to n do
     if (p<>i) and (v[i].s='+') then
       begin
       m:=s-(ss-2*v[i].n);
       if m<0 then m:=-m;
       if min>m then
         begin
         min:=m;
         v[i].s:='-';
         v[p1].s:='+';
         p1:=i;
         end;
       end;
   p:=p1;
   ss:=ss-2*v[p].n;
  end;

 procedure plus;
  var i,m,min,p1:longint;
  begin
   min:=s-(ss+2*v[1].n);
   v[1].s:='+';
   if min<0 then min:=-min;
   p1:=1;
   for i:=2 to n do
     if (p<>i) and (v[i].s='-') then;
       begin
       m:=s-(ss+2*v[i].n);
       if m<0 then m:=-m;
       if min>m then
         begin
         min:=m;
         v[i].s:='+';
         v[p1].s:='-';
         p1:=i;
         end;
       end;
   p:=p1;
   ss:=ss+2*v[p].n;
  end;

begin
  assign(f,'semne.in');
  assign(g,'semne.out');
  reset(f);
  rewrite(g);
  citire;
  ss:=0;
  for i:=1 to n do
    begin
    ss:=ss+v[i].n;
    v[i].s:='+';
    end;
  p:=0;
  while ss<>s do
    if ss>s then minus
    else plus;
  for i:=1 to n do write(g,v[i].s);
  close(f);
  close(g);
end.