最大组合数

昨天陪室友参加数梦工厂的宣讲会,在现场参加了笔试。笔试题目基本上中规中矩,有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$$下证这是一个全序:

  1. (自反性)显然成立;

  2. (反对称性)如果有\(a\leq_{new}b\land b\leq_{new}a\),则有\(a*10^{w(b)}+b = b*10^{w(a)}+a\ \to a=_{new}b\),故成立

  3. (传递性)如果有\(a\leq_{new}b\land b\leq_{new}c\),则有

\[\frac{a}{b}\leq\frac{10^{w(a)}-1}{10^{w(b)}-1} \tag{1} \]

\[\frac{b}{c}\leq\frac{10^{w(b)}-1}{10^{w(c)}-1} \tag{2} \]

因而有\((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$$

  1. 显然,\(\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\)

posted @ 2016-03-25 10:33  涅寂静  阅读(916)  评论(0)    收藏  举报