会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
每个数字恰好进入两个部分中的一个,两边都不能是空的。同一边里的数字可以任意排列,再连成一个整数。把较大的整数记为 P,较小的记为 Q,差是 R=P−Q。需要列出所有使 R 最小的整数对。不同拆法如果拼出同一对整数,只保留一次,并按 P 从小到大输出。
- 长度不超过 101,用二进制掩码枚举每个数字分到哪一边。掩码为 0 或全 1 时有一边为空,直接跳过。左右对调还是同一个划分,因此只处理掩码较小的那一次。数字相同的时候,不同掩码可能对应同一组数字,这种划分只计算一次。
- 每一边先排序,再按字典序生成下一个排列,并把排列拼成整数。重复数字不会走出新的排列,因此相同整数只会出现一次。
- 两边的整数两两配对。比较时使用临时变量,把较大值放在前面再计算差值,避免改写循环变量后影响下一次配对。差值变小就清空已保存的整数对;差值等于当前最小值就把这一对放进集合。
- 集合按较大整数升序输出。第一行是对数,后面每一行依次写出较大整数、较小整数和差值。