Problem A. 最小差距
时间限制 1000 ms
内存限制 128 MB
题目描述
给定一些不同的一位数字,你可以从这些数字中选择若干个,并将它们按一定顺序排列,组成一个整数,把剩下的数字按一定顺序排列,组成另一个整数。组成的整数不能以0开头(除非这个整数只有1位)。
例如,给定6个数字,0,1,2,4,6,7,你可以用它们组成一对数10和2467,当然,还可以组成其他的很多对数,比如210和764,204和176。这些对数中两个数差的绝对值最小的是204和176,为28。
给定N个不同的0-9之间的数字,请你求出用这些数字组成的每对数中,差的绝对值最小的一对(或多对)数的绝对值是多少?
输入数据
第一行包括一个数 T (T ≤ 1000),为测试数据的组数。
每组数据包括两行,第一行为一个数 N (2 ≤ N ≤ 10),表示数字的个数。下面一行为 N 个不同的一位数字。
输出数据
T 行,每行一个数,表示第 i 个数据的答案。即最小的差的绝对值。
样例输入
1 | 2 |
样例输出
1 | 28 |
题解
首先将所有数字从小到大排序,接着这道题可以分三种情况考虑:
(1)只有两个数的情况:直接两数相减取绝对值即可。
(2)奇数个数的情况:首先保证第一个数字非0,如果为0,就将第一个数与第二个数交换位置,然后从左往右连续取n/2+1
个数组成第一个整数,最后从右往左连续取n/2
个数,即剩下的所有数组成另一个整数。这样所求得的一对整数的差的绝对值最小。
(3)偶数个数的情况:从左往右依次枚举,首先保证第一个数非0,如果为0,就从下一个数开始枚举;取第k
个数作为第一个整数的第一个数字,取第k+1
个数作为第二个整数的第一个数字;然后,对于剩下的数字,从右往左连续取n/2-1
个数加入第一个整数中,从左往右连续取n/2-1
个数加入第二个整数中;最后,取差的绝对值最小的一对整数。
AC代码
1 | #include <iostream> |