MCLONUM - Closest Number
Tác giả: RR
Ngôn ngữ: Pascal
{$R+,Q+}
{$Mode objFPC}
uses math;
const
FINP='';
FOUT='';
MAXN=111;
so:array['0'..'9'] of longint=(0,1,2,3,4,5,6,7,8,9);
var
f1,f2:text;
n:longint;
a,b:array[1..MAXN] of longint;
temp,count:array[-1..10] of longint;
procedure openF;
begin
assign(f1,FINP); reset(f1);
assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
close(f1);
close(f2);
end;
procedure inp;
var
i:longint;
s:string;
begin
readln(f1,s); n:=length(s);
for i:=1 to n do a[i]:=so[s[i]];
readln(f1,s);
for i:=1 to n do b[i]:=so[s[i]];
for i:=1 to n do
inc(count[b[i]]);
end;
procedure solve1;
var
x,c,i,now:longint;
ok:boolean;
begin
for i:=1 to n do inc(temp[a[i]]);
ok:=true;
for c:=0 to 9 do
if count[c]<>temp[c] then ok:=false;
if ok then
begin
for i:=1 to n do write(f2,a[i]);
writeln(f2);
exit;
end;
count[10]:=1;
temp:=count;
for x:=n downto 1 do
begin
count:=temp;
for i:=1 to x-1 do dec(count[a[i]]);
ok:=true;
for c:=0 to 9 do
if count[c]<0 then ok:=false;
if not ok then continue;
for c:=a[x]+1 to 9 do
if count[c]>0 then
begin
for i:=1 to x-1 do write(f2,a[i]);
write(f2,c); dec(count[c]); now:=0;
for i:=x+1 to n do
begin
while count[now]=0 do inc(now);
write(f2,now); dec(count[now]);
end;
writeln(f2);
exit;
end;
end;
writeln(f2,0);
end;
procedure solve2;
var
x,c,i,now:longint;
ok:boolean;
begin
fillchar(count,sizeof(count),0);
count[10]:=1; count[-1]:=1;
for i:=1 to n do
inc(count[b[i]]);
temp:=count;
for x:=n downto 1 do
begin
count:=temp;
for i:=1 to x-1 do dec(count[a[i]]);
ok:=true;
for c:=0 to 9 do
if count[c]<0 then ok:=false;
if not ok then continue;
for c:=a[x]-1 downto 0 do
if (x>1) or (c>0) then
if count[c]>0 then
begin
for i:=1 to x-1 do write(f2,a[i]);
write(f2,c); dec(count[c]); now:=9;
for i:=x+1 to n do
begin
while count[now]=0 do dec(now);
write(f2,now); dec(count[now]);
end;
writeln(f2);
exit;
end;
end;
fillchar(count,sizeof(count),0);
for i:=1 to n do
inc(count[b[i]]);
if count[0]>0 then
begin
dec(count[0]);
for i:=9 downto 0 do
while count[i]>0 do
begin
write(f2,i);
dec(count[i]);
end;
writeln(f2);
exit;
end;
writeln(f2,0);
end;
begin
openF;
inp;
solve1;
solve2;
closeF;
end.