数据结构和算法分析

经典题型——高楼扔鸡蛋确定鸡蛋破碎的临界楼层

2021-01-09  本文已影响0人  我是古月

问题:100层高楼,有两个完全一样的鸡蛋,假设从某一层上扔鸡蛋,恰好会破碎。通过最优策略找到使得鸡蛋破碎的临界层需要扔多少次?

一、问题解读。

1.首先梳理题干。

从楼上投掷鸡蛋有两种结果,一种是破碎,一种是完好。

如果只有一个鸡蛋,只能从第一层开始投掷,如果第一层不碎,继续从第二层开始投掷,直到第N层恰好鸡蛋破碎,则需要N次确定鸡蛋恰好破碎的临界层。

那么现在有两个鸡蛋,第一个鸡蛋为A,第二个鸡蛋为B,A先使用,当A破碎后B再使用,猜想这两个鸡蛋分别有什么作用?如何投掷才能最快知道这个临界层呢?

2.为了更深刻理解题意,以及探索A与B分别起什么作用,尝试采用二分法。

①假设将(1,100)分为两个区间(1,50),(50,100)。

在50层投掷鸡蛋A,如果A破碎,则确定临界层在(1,50)范围。那么B只能从第1层开始投掷,直到找到临界层,这样次数达到50次之多。那么B为什么不能从25层开始投掷呢,因为只有两个球,如果B在25层破碎,那么(1,24)这个范围是否包含临界层不得而知。

同样在50层时A没有破碎,那么确定临界层在(51-100)范围。B只能从51层开始投掷。

综上所述,将(1,100)分为两个区间(1,50),(50,100),在最坏的情况下,需要投掷50次,使得无法快速找到临界层。

②假设将(1,100)分为10个区间(1,10),(10,20),…,(90,100)。取10,20,30,...,80,90作为A鸡蛋每次投掷的层数,如果A第一次在10层投掷未碎,则第二次在20层,依次类推。

如图1所示:

图1

从图中可以得到:

.无论鸡蛋A每次从以上哪层投掷,在最坏情况下鸡蛋B投掷的次数都是9(不包括第100层)而鸡蛋A在最坏情况下需要投掷9次,总的次数为9+9=18.。第100层不需要投掷,由题干而知会碎。

.采用该方法,A投掷且破碎的次数是包含于范围(1,9),是线性递增的,B的次数是固定的为9,两者不相关联。

③得出两个结论:

.如果采用多区间均分的方式,则A投掷且破碎的次数线性递增,B的次数固定,且关联性缺乏规律,无法找到最优解。

.鸡蛋A的作用是确定临界层的区间,鸡蛋B的作用在该区间查找临界层。

那么是否存在一组数据,A1,A2,A3...An,使得鸡蛋A在A1,A2,A3...An 层投掷时A的次数,与在最坏情况下鸡蛋B投掷的次数相关联且有规律?

二、提出假设。

假设在最坏情况下,A投掷的次数是A(k),B投掷的次数是B(k)。总的次数是K(K∊N)。

其中A(k)<=K,B(k)<K。

存在K,使得三者存在一种关系:A(k)+B(k)=k.

三、推导。

如图2所示:

图2

①如果第1次A在A1层破碎,则A1,B1,K满足以下条件。

B1=K-1

A1=K

此处A1=K是为什么呢?。

推导如下:

A第一次在A1层投掷破碎,A的投掷次数为1。

则总的投掷次数为:B1+1=K  =>B1=K-1

因此只有当A在第K层破碎时才满足B1=K-1。

②如果第1次A没有在A1层破碎,则第2次最坏情况下即A在A2层投掷且 破碎,则A2,B2,K需要满足以下条件。

B2=K-2.

A2-A1-1=B2=K-2=>A2=A1+K-1.

③如果第2次A没有在A2层破碎,则第3次最坏情况下A在A3层投掷且 破碎,则A3,B3,K满足以下条件。

B3=K-3.

A3-A2-1=B3=K-3=>A3=A2+K-2=> A3=K+K-1+K-2.

同理第n(n<=K)次时当且仅当n=K时,A(K)=K+K-1+K-2+K-3+...+2+1=>K(K+1)/2

结果如图3所示

图3

可得出:K(K+1)/2>=100

得出K>=14

依次为A每次投掷的层数为14,27,39,50,60,69,77,84,90,95,99,102,104,105.

四、结论。

最优策略:

第一步:A第一次从第14层开始投掷,如果破碎,B在(1,13)范围内由低层到高层开始投掷,直至找到临界层。

第二步:如果A没有在14层破碎,则第二次从27层开始投,然后又分为是否破碎两种情况,同理第一步,直到找到临界层。

综上所述,100层楼高,在最坏情况下,两鸡蛋至少需要投掷14次才能确定临界层。

五.其他算法

现在已知初始状态:鸡蛋数量和楼层数,以及在投掷鸡蛋是否破碎条件下如何选择。可知符合动态规划法的条件。

那么是否能采用更加“省事”的算法例如动态规划法解决问题呢?

下次探讨。

上一篇下一篇

猜你喜欢

热点阅读