Cod sursa(job #18077)

Utilizator andreitheo87Teodorescu Andrei-Marius andreitheo87 Data 18 februarie 2007 02:02:09
Problema Semne Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.41 kb
var fi,fo:text;
    poz1,poz2,j,aux,poz,i,n,nr:longint;
    v:array[1..50000]of longint;
    s,sum,vec:int64;
    plus:array[1..50000]of boolean;
    inv:boolean;
procedure try(poz:longint);
begin
 if plus[poz]then
  if(sum>s)and(abs(sum-s)>abs(sum-2*v[poz]-s)) then
   begin
         plus[poz]:=false;
         dec(sum,2*v[poz]);
   end
  else begin end
 else if(sum<s)and(abs(sum-s)>abs(sum+2*v[poz]-s)) then
       begin
             plus[poz]:=true;
             inc(sum,2*v[poz]);
       end;
end;
procedure clear;
begin
 sum:=0;
 for i:=1 to n do
  if random(2)=1 then
   begin
         inc(sum,v[i]); plus[i]:=true;
   end
  else begin
             dec(sum,v[i]); plus[i]:=false;
       end;
end;
procedure try2(poz1,poz2:longint);
begin
 try(poz1);
 if poz1<>poz2 then
  if plus[poz1]=plus[poz2]then
   begin end
  else begin
             if plus[poz2]then
              begin aux:=poz1; poz1:=poz2; poz2:=aux; end;
             if abs(sum-s)>abs(sum+2*v[poz2]-2*v[poz1]-s)then
             begin
                   sum:=sum+2*v[poz2]-2*v[poz1];
                   plus[poz1]:=false;
                   plus[poz2]:=true;
             end;
       end;
end;
begin
 randomize;
 assign(fi,'semne.in'); reset(fi);
 assign(fo,'semne.out'); rewrite(fo);
 readln(fi,n,s);
 if s<0 then
  begin s:=-s; inv:=true; end
 else inv:=false;
 for i:=1 to n do read(fi,v[i]);
 {sum:=0;
 for i:=1 to n do inc(sum,v[i]);}
 {xx:=(sum+s)div 2;}
 fillchar(plus,sizeof(plus),true);
 {while sum<>s do
  begin
        poz:=random(n)+1;

  end;}
 vec:=abs(sum-s);
 clear;
 while sum<>s do
  begin

        if abs(sum-s)=vec then
         begin
               inc(nr);
               if nr>1 then clear;
               {readln;}
         end
        else begin
                   vec:=abs(sum-s);
                   nr:=0;
             end;
        {poz1:=random(n-1)+1;}
        {poz2:=random(n)+1;}
        {if random(10)=4 then}
        for j:=n-1 downto 1 do
        begin
        poz1:=j;
        poz2:=poz1+1;
        for i:=1 to 5 do
         begin
               if poz2<>n then
                if random(2)=1 then inc(poz2);
         end;
        try2(poz1,poz2);
        poz2:=random(n)+1;
        try2(poz2,poz1);
        end;

  end;
 for i:=1 to n do
  if(plus[i]and not inv)or(not plus[i]and inv)then
   write(fo,'+')
  else write(fo,'-');
 writeln(fo);
 close(fo);
end.