关于100层楼,扔两个鸡蛋,求摔碎鸡蛋的临界层的问题

        题目描述:

        两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。

 

网上有人说可以写动态规划方程来解决,我也没看。不过依我之见,这个问题通过简单的证明就可以得出结论。我们可以直接对n层建筑来分析。

如果我们只有一个鸡蛋,那么只能从最底层,一层一层的做实验,直到鸡蛋摔碎为止。

对于一个x层的楼,做这种实验最坏情况下需要的次数记为f(x).

现在我们有两个鸡蛋,并假设我们已经知道临界层是在[a,b]之间(共b-a+1层),那么我们第一次尝试要从哪层开始呢?假设从第a+k层开始,那么分两种情况

1)          鸡蛋在第a+k层碎了,那么我们接下去要用剩下的那个鸡蛋从第a层开始,一层一层尝试下去,这样最坏情况下还需要尝试k(a,a+1,…,a+k-1)

2)          鸡蛋在第a+k层没有碎,那么我们就知道了,临界区是在[a+k+1,b]之间(共有b-a-k),这样我们就把问题转化成为了一个更小的问题了。

以上两种情况,第一种情况下的最坏情况,总共尝试了k+1次,而第二中情况下,最坏的可能是1+f(b-a-k)。因此我们有:

f(b-a+1)=min{max{1+k,1+f(b-a-k)}|0<=k<=b-a}

很容易证明,函数f(x)是随自变量x单调递增的。于是我们有:1+k随着k的增加而单调递增,1+f(b-a-k)随着k的增加而单调递减。我们可以证明,当1+k=1+f(b-a-k)的时候,max{1+k,1+f(b-a-k)}取得最小值。证明如下,假设有任意一个k’!=k

如果k’>k,那么1+k’>1+k, 1+f(b-a-k’)<1+f(b-a-k).由于1+k=1+f(b-a-k),因此有1+f(b-a-k’)<1+f(b-a-k)=1+k<1+k’

显然有max{1+k’,1+f(b-a-k’)}>max{1+k,1+f(b-a-k)}

如果k’<k,则我们会得到1+k’<1+k=1+f(b-a-k)<1+f(b-a-k’),于是同样得出上述结论。

由上可知,我们第一步所要取的k,就是使得1+k=1+f(b-a-k)的一个值。那么对于n层的楼来说,我们有:

F(n)=1+k1=1+f(n-k1-1)

F(n-k1-1)=1+k2=1+f(n-k1-k2-2)

F(1)=1

F(0)=0

 

由以上一些公式我们可知:

1)1+k1=1+f(n-k1-1)=1+(1+k2),即k1=k2+1,这说明k1,…,km是一些连续的整数

2)n-(k1+1)-(k2+1)-…-(km+1)=0, 说明这些连续的整数(k1+1,…,km+1)的和是n

3)km<=0,说明这些连续的整数(k1+1,…,km+1)是从1开始的

由以上3点,我们可以知道,k1就是满足1+…+(k1+1)=(k1+2)(k1+1)/2=n的那个数。当然,如果找不到一个k1满足(k1+2)(k1+1)/2=n,那么只需要找到一个最小的k1满足(k1+2)(k1+1)/2>n,就行了。

 

由上可以看出,这道题我们不需要编程序什么的,只需要运用一点点算数小技巧,就可以推理得到答案。对于100层楼的情况,那么由于满足条件的最小k1是13,所以我们第一次就从第k1+1=13+1=14层开始做实验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值