2016普级组模拟试题(20161114) Closest

Description

考虑两个n位的十进制正整数A和B,都没有前导0。我们需要找到两个最近的靠近A的n位数(第一个比A大或与A相等,第二个严格比A小),使得它们的十进制表示是B中所有数字的某个排列。

比如说,假如A=3022并且B=1232,用B的数字我们可以获得以下的4位数字:1223, 1232, 1322, 2123, 2132, 2213, 2231, 2312, 2321, 3122, 3212和3221。最小的比A大或者和A相等的数,且用B中的数字组成的是3122,并且最大的严格比A小的数是2321。如果A=1232而且B=3022,可能的数字是2023, 2032, 2203, 2230, 2302, 2320, 3022, 3202和3220。在用B中数字组成的数中,最小的比A大或与A相等的数是2023,没有比A小的数。

对于给定的A和B,写一个程序closest找到这些“最靠近A”的数字,或者判断它们中的一个不存在。

Input

输入文件closest.in包含2行:
第1行为一个正整数A。
第1行为一个正整数B。
(A,B均为n位的正整数)

Output

输出文件closest.out共有2行。
第一行:最小的不比A小的n位数,没有前导0,包含B中的所有字符,以某一顺序排列。如果这样的数不存在,那么输出0。
第二行:最大的比A小的n位数,没有前导0,包含B中的所有字符,以某一顺序排列。如果这样的数不存在,那么输出0。

Sample Input

输入样例1
3075
6604

输入样例2
3000203
4562454
Sample Output

输出样例1
4066
0

输出样例2
4244556
2655444

题解

把b中各种数字个数记录下来,从左往右枚举每一位放上比它大的数字,一旦有一位大于它,则后面的数从小到大排序。

代码

var
  a,g:array[0..9] of longint;
  t:array[1..100] of longint;
  s,b:string;
  f:boolean;
procedure mains(x,y:longint);
var
  i:longint;
begin
  if (x-1=length(b))and(f) then
    begin
      for i:=1 to x-1 do
        write(t[i]);
      writeln;
      halt;
    end;
  if (x-1=length(b))and(not f) then
    exit;
  for i:=9 downto 0 do
    if (a[i]>0)and(f)or(a[i]>0)and(i<=y) then
      begin
        if (i=0)and(x=1) then break;
        if i<y then f:=true;
        dec(a[i]);
        t[x]:=i;
        mains(x+1,ord(s[x+1])-48);
        inc(a[i]);
      end;
end;
procedure main(x,y:longint);
var
  i:longint;
begin
  if x-1=length(b) then
    begin
      for i:=1 to x-1 do
        write(t[i]);
      writeln;
      fillchar(t,sizeof(t),0);
      f:=false;a:=g;
      mains(1,ord(s[1])-48);
      writeln(0); 
      halt;
    end;
  for i:=0 to 9 do
    if (a[i]>0)and(f)or(a[i]>0)and(i>=y) then
      begin
        if i>y then f:=true;
        dec(a[i]);
        t[x]:=i;
        main(x+1,ord(s[x+1])-48);
        inc(a[i]);
      end;
end;
var
  i:longint;
begin
  f:=false;
  readln(s);
  readln(b);
  for i:=1 to length(b) do
    inc(a[ord(b[i])-48]);
  g:=a;
  main(1,ord(s[1])-48);
  writeln(0);
  fillchar(t,sizeof(t),0);
  f:=false;a:=g;
  mains(1,ord(s[1])-48);
  writeln(0);
end.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值