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.

Download