Cod sursa(job #312343)

Utilizator FllorynMitu Florin Danut Flloryn Data 5 mai 2009 19:08:54
Problema Semne Scor 100
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.29 kb
    type vector=array[0..50000]of longint;
    var i,j,n,e,i1,i2,max:longint;
        v,plus,minus:vector;
        sort,sort1:array[1..5000010]of word;
        gasit:boolean;
        sum,s:int64;

    procedure qsort(ls,ld:longint;var v:vector);
    var i,j,aux:longint;
   begin
     i:=ls;j:=ld;
     while true do begin
       while (v[i]<=v[j])and(i<>j) do inc(i);
       if i=j then break;
       aux:=v[i];v[i]:=v[j];v[j]:=aux;dec(j);
       while (v[i]<=v[j])and(i<>j) do dec(j);
       if i=j then break;
       aux:=v[i];v[i]:=v[j];v[j]:=aux;inc(i);
     end;
     if j-1>ls then qsort(ls,j-1,v);
     if j+1<ld then qsort(j+1,ld,v);
   end;


   begin
   randomize;
   assign(input,'semne.in');reset(input);
   assign(output,'semne.out');rewrite(output);
   readln(n,s);
   sum:=0;
   plus[0]:=n;
   for i:=1 to n do
           begin
           read(v[i]);
           plus[i]:=v[i];
           sum:=sum+v[i];
           end;
   i:=0;
   while sum<>s do
           begin
           inc(i);
           if sum<s then
                   begin
                   e:=random(minus[0])+1;
                   sum:=sum+2*minus[e];
                   inc(plus[0]);
                   plus[plus[0]]:=minus[e];
                   minus[e]:=minus[minus[0]];
                   dec(minus[0]);
                   end;
           if sum>s then
                   begin
                   e:=random(plus[0])+1;
                   sum:=sum-2*plus[e];
                   inc(minus[0]);
                   minus[minus[0]]:=plus[e];
                   plus[e]:=plus[plus[0]];
                   dec(plus[0]);
                   end;
           end;
   qsort(1,plus[0],plus);
   qsort(1,minus[0],minus);
   i1:=1;
   i2:=1;
   while (i1<=plus[0])and(i2<=minus[0]) do
          begin
           while (plus[i1]<=minus[i2])and(i1<=plus[0]) do
                   begin
                   write('+');
                   inc(i1);
                   end;
           while (plus[i1]>minus[i2])and(i2<=minus[0]) do
                   begin
                   write('-');
                   inc(i2);
                   end;
           end;
   for i:=i1 to plus[0] do
           write('+');
   for i:=i2 to minus[0] do
           write('-');
   close(input);close(output);
   end.