正整数连接最小算法

题目:

有n个正整数数,将他们按十进制按某种顺序组成一个更大的整数,求最小的这个整数。

举例,有数字32和321,连接成32132后最小。

又举例,有数字1876,98,21,4,211连接成1876 211 21 4 98是最小的。


解决思路:

1.用背包动态规划的思想很容易。因为ABCD最小的必要条件ABC最小,时间复杂度是0(n*n*k)


2.第二种解决方法要先做一个数学证明。

首先,规定一种比较规则:a->b表示ab<ba成立,记作规则一。

其次:需要证明一个定律。

定律一:n个正整数的最小组合

X1X2X3....Xn中,Xi->Xj(其中i<j)一定成立。

证明这个定律我们可以用反证法。

假设最小的组合中存在Xj->Xi(其中i<j),即XiXj>XjXi那么要证明假设不成立我们只需要证明Xi...Xj不是最小的即可。

可以分两种情况:

第一种:j=i+1。很显然,XjXi比XiXj更小,这种情况假设不成立。

第二种:j>i+1。即Xi Xi+1...Xj-1 Xj。为了方便,我们把中间的记作y,把Xi记作a,把Xj记作b。也就是所,我们必须证明ayb不是最小的。

假如ayb是最小的,那肯定存在ay<ya和yb<by。设a的位数是m,y的位数是n,b的位数是k。那么

1.ay<ya   ==>   a*10^n+y<y*10^m+a   ==>   a*(10^n-1)/(10^m-1) < y 

2.yb<by   ==>   y*10^k+b<b*10^n+y     ==>   y<b*(10^n-1)/(10^k-1)

3.综合1和2可以得出a*(10^k-1)<b*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值