美文网首页数据结构和算法分析
经典题型——高楼扔鸡蛋确定鸡蛋破碎的临界楼层

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

作者: 我是古月 | 来源:发表于2021-01-09 19:51 被阅读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次才能确定临界层。

    五.其他算法

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

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

    下次探讨。

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/ajmcaktx.html