Pagini recente » Cod sursa (job #3229592) | Cod sursa (job #29160) | Cod sursa (job #517008) | Cod sursa (job #34333) | Cod sursa (job #18065)
Cod sursa(job #18065)
var fi,fo:text;
poz1,poz2,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;
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>n div 10 then clear;
end
else begin
vec:=abs(sum-vec);
nr:=0;
end;
poz1:=random(n-1)+1;
{poz2:=random(n)+1;}
poz2:=poz1+1;
if poz1<>poz2 then
if plus[poz1]=plus[poz2]then
begin try(poz1); try(poz2); 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;
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.