会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
每个数字恰好进入两个部分中的一个,两边都不能是空的。同一边里的数字可以任意排列,再连成一个整数。把较大的整数记为 P,较小的记为 Q,差是 R=P−Q。需要列出所有使 R 最小的整数对。不同拆法如果拼出同一对整数,只保留一次,并按 P 从小到大输出。
- 长度不超过 101,用二进制掩码枚举每个数字分到哪一边。掩码为 0 或全 1 时有一边为空,直接跳过。左右对调还是同一个划分,因此只处理掩码较小的那一次。数字相同的时候,不同掩码可能对应同一组数字,这种划分只计算一次。
- 每一边先排序,再按字典序生成下一个排列,并把排列拼成整数。重复数字不会走出新的排列,因此相同整数只会出现一次。
- 两边的整数两两配对。比较时使用临时变量,把较大值放在前面再计算差值,避免改写循环变量后影响下一次配对。差值变小就清空已保存的整数对;差值等于当前最小值就把这一对放进集合。
- 集合按较大整数升序输出。第一行是对数,后面每一行依次写出较大整数、较小整数和差值。
题目内容
这里有一列正整数,长度记为 K。列中每个数只取 1 到 9,并且同一个数可以反复出现。
需要把这些数拆进两个部分,每一边至少放一个数,每个数正好被用一次。两边各自占据的位置不必连在一起。同一边内部可以打乱先后,再顺着书写顺序连成一个整数。希望得到的两个整数尽量靠近。比较时只保留不小于零的差:较大的那个整数叫做 P,较小的叫做 Q,二者的差记作 R=P−Q。
把所有能使 R 达到最小的整数对都列出来。每一行写一组 P、Q、R。若不同的拆法拼出了同一对整数,这一对只保留一次。多组结果里 R 一样小时,按 P 由小到大逐行给出。
输入描述
评测机经由标准输入送入全部数据。
- 第一行是一个整数 K,表示这一列有多长。
- 第二行是 K 个整数 d1,d2,…,dK,相邻两项之间用空格隔开。
数据范围:
- 2≤K≤10
- 1≤dj≤9
输出描述
- 先输出一行整数 T,表示达到最小差的整数对有多少组。
- 再输出 T 行,每一行写出三个整数 P Q R。它们满足 P−Q=R,并且 P≥Q,其中 R 就是那个最小差。行与行之间按 P 由小到大排列。
样例1
输入
2
7 2
输出
1
7 2 5
说明
- 只有两个数,只能一边放一个。
- 较大的是 7,较小的是 2,差为 5。不存在更小的差。
样例2
输入
3
1 9 1
输出
1
11 9 2
说明
- 两个 1 放在同一边,连成 11;9 单独放在另一边。差是 2。
- 这两个 1 在原列中并不相邻,中间隔着 9。
- 若让 9 跟其中一个 1 同边,会得到 19 与 1,或者 91 与 1。差分别是 18 和 90,都比 2 大。
样例3
输入
4
3 1 3 1
输出
2
13 13 0
31 31 0
说明
- 两边各拿一个 1 和一个 3。两边都可以排成 13,也可以都排成 31,差都是 0。
- 13 与 31 相差 18,不是最小。
- 一边放两个 1、另一边放两个 3,得到 11 与 33,差是 22。
- 最小差是 0,一共两组。按 P 由小到大,先写 13,再写 31。