最大组合数
昨天陪室友参加数梦工厂的宣讲会,在现场参加了笔试。笔试题目基本上中规中矩,有3道题吸引了我的注意力。其中有一道算法设计题,虽然挺简单,但是也算有点意思,所以分享一下解法。题目大意如下:
有若干个正整数,如何使用catenation,使得所有这些整数的组合值最大,例如{9,1},有19<91。
解法:
定义函数w(a) = a的位数;
定义\(=_{new}\):$$a=_{new}b\Leftrightarrow a10^{w(b)}+b = b10^{w(a)}+a$$
定义在商集\(N'=N_+/=_{new}\)上的一个序\((N',\ \leq_{new})\):$$a \leq_{new} b \Leftrightarrow a10^{w(b)}+b\leq b10^{w(a)}+a$$下证这是一个全序:
-
(自反性)显然成立;
-
(反对称性)如果有\(a\leq_{new}b\land b\leq_{new}a\),则有\(a*10^{w(b)}+b = b*10^{w(a)}+a\ \to a=_{new}b\),故成立
-
(传递性)如果有\(a\leq_{new}b\land b\leq_{new}c\),则有
因而有\((1)*(2)\):$$\frac{a}{c}\leq\frac{10{w(a)}-1}{10-1} \tag{3}$$
即:$$a10^{w(c)}+c\leq c10^{w(a)}+a\to a\leq_{new}c$$
- 显然,\(\forall a,\ b\in N'\),有\(a\leq_{new}b \lor b\leq_{new}a\)
所以,\((\leq_{new},\ N')\)是一个全序。
既然我们已经得到了N'上的一个全序,那么原始的问题就变成了一个从大到小的排序问题(注意,我们的全序关系指明了如果\(a\leq_{new}b\),那么a在连接的时候放在b的后面得到的数比较大)。用于排序的算法很多,从速度上来看,可以用快速排序来解决这个问题,并且最好先线性扫一遍所有的整数,获得他们的位数,最后算法的平均时间复杂度显然是\(O(nlogn)\)。
需要注意的地方有,我们在编程的时候需要注意\(==\)和\(\leq\)的重载,例如在这里的定义中显然有\(9==99\)和\(14\leq9\)。
浙公网安备 33010602011771号