那些无聊的字符串 [搬家]2009年06月13日

问题:


设有n个正整数,将它们联接成一排,组成一个最小的多位整数。

程序输入:n个数
程序输出:联接成的多位数

例如:
n=2时,2个整数32,321连接成的最小整数为:32132,
n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355

 

解答:

 

 

输出:


31231
312313355

 


BYR 论坛上给出的 “可排序证明”的形式化证明

 

附:可排序性的证明

 

题目描述:

比较规则定义:对于任意字符串a,b,如果存在 ab<ba(ab表示a和b连结操作,’<’ 表示字典序大小的比较),那么我们就定义 a 是先序于 b 的。

下面要证明的是,对n个字符串,用上面的规则是可排序的。

 

 

证明:

首先,他是可比较的,这个没有疑问。

那么问题就在于,他是不是会出现一个环。如果出现了一个环,那就没办法排序了;如果没有出现环,我们就可以对他进行拓扑排序。

假设,这个比较规则是具有传递性的,也就是说如果 ab<ba && bc<cb 那么,一定存在ac<ca。即 a先序于b,b先序于c,则一定有a先序于c。如果传递性成立,那么就不可能出现环,那么也就证明了这个比较规则是可排序的。

 

 

下面来证明传递性

重新描述如下:对于任意字符串a,b,c,如果ab<ba且bc<cb。那么一定有ac<ca。

 

首先,一个字符串可以表达为一个z进制的数。z可以是字母表的大小,比如26,52,62或者128,256。

然后我们定义|a|,|b|,|c|,为字符串a,b,c的长度。

那么,ab = a * z ^ |b| + b , ba = b * z ^ |a| + a

bc = b * z ^ |c| + c , cb = c * z ^ |b| + b

ac = a * z ^ |c| + c , ca = c * z ^ |a| + a

 

因为字符串ab和ba的长度是一样的,所以ab的字典序小于ba等价于代数上ab<ba 。同理还有bc<cb和ac<ca。

下面就来证明下面的代数推导,ab<ba && bc<cb => ac<ca。

由上面的式子得到:

 

a * z ^ |b| + b < b * z ^ |a| + a …………………..A

b * z ^ |c| + c < c * z ^ |b| + b …………………..B

化简A: a *(z^|b|-1) < b *(z^|a|-1)

因为 |a|>0, 所以 z^|a|-1 > 0

所以 a * (z ^ |b| - 1) / (z ^ |a| - 1)<b ……………C

 

同理化简B:b * (z ^ |c| - 1) < c * (z ^ |b| - 1)

B < c * (z ^ |b| - 1) / (z ^ |c| - 1)……………….D

由C,D得: a * (z ^ |b| - 1) / (z ^ |a| - 1) < c * (z ^ |b| - 1) / (z ^ |c| - 1)

于是有: a * (z ^ |c| - 1) < c * (z ^ |a| - 1)

a * z ^ |c| + c < c * z ^ |a| + a

这就得到了ac<ca 。

 

于是,证明了这个规则的传递性,也就证明了不存在环,即可排序性 。

证毕

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值