zoukankan      html  css  js  c++  java
  • 一道有趣的面试题

      日前在网上看到一道面试题。颇有意思,也细细的研究一番。现将该题发布于此,和各位交流一下。

      某幢大楼有100层。你手里有两颗一模一样的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式。

      例如:有这样一种方式,第一次选择在60层扔,若碎了,说明临界点在60层及以下楼层,这时只有一颗珠子,剩下的只能是从第一层,一层一层往上实验,最坏的情况,要实验59次,加上之前的第一次,一共60次。若没碎,则只要从61层往上试即可,最多只要试40次,加上之前一共需41次。两种情况取最多的那种。故这种方式最坏的情况要试60次。

      那该如何设计方式呢?

      仔细分析一下,关键是第一次的选择,假设在第N层,如果第一次扔的时候就碎了,那么第二颗珠子只能是从第1层开始一层层往上试,此时,最坏的情况为N-1次,加上第一次,则一共为N层。那如果不碎呢,第二颗珠子会从N+1层开始试吗?很显然不会,此时大楼还剩100-N层,问题就转化为100-N,2颗珠子,请设计最有效方式。

      哦,等等想到什么?呵呵,我想到递归

      定义一个函数F(N),表示N层楼最有效方式最坏情况的次数。

      通过上面的分析,有

      F(N)=Min(Max(1,1+F(N-1)),Max(2,1+F(N-2)),……,Max(N-1,1+F(1)))

      F(1)=1

      本面试题就是求F(100)

      下面把解法的代码赋予其后,用的是VB2005

      

    1 Dim F(100) As Integer, i As Integer, j As Integer
    2 Dim tC As Integer
    3 F(0) = 0
    4 F(1) = 1
    5
    6 For i = 2 To 100
    7 F(i) = 100
    8 For j = i To 1 Step -1
    9 tC = IIf(j > 1 + F(i - j), i, 1 + F(i - j))
    10 If tC < F(i) Then F(i) = tC
    11 Next
    12 Next
    13
    14 For i = 1 To 100
    15
    16 Debug.Print(F(i))
    17 Next
  • 相关阅读:
    基于element-ui图片封装组件
    计算时间间隔具体每一天
    C语言学习笔记 —— 函数作为参数
    AtCoder Beginner Contest 049 题解
    AtCoder Beginner Contest 048 题解
    AtCoder Beginner Contest 047 题解
    AtCoder Beginner Contest 046 题解
    AtCoder Beginner Contest 045 题解
    AtCoder Beginner Contest 044 题解
    AtCoder Beginner Contest 043 题解
  • 原文地址:https://www.cnblogs.com/grenet/p/1628425.html
Copyright © 2011-2022 走看看