笑看风云

记录生活中的启迪与感动
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一道游戏公司程序员笔试题

Posted on 2010-01-20 11:01  清晨的风  阅读(862)  评论(0编辑  收藏  举报

You have been given 2 special, extremely rugged Xboxes. You are in an office building that is 100 stories high. Using the fewest possible number of drops from windows in your office building, determine the highest floor you can drop an Xbox from and have it survive: for example, they might be able to take the drop from the 30th floor, but not the 31st. You can break both Xboxes in your search. State the worst case number of drops needed and explain how you arrived at that answer.
你在一幢100层的办公楼里上班,现在给你两台xbox(已经特意捆绑包扎好),要求你用尽可能少的试摔次数来判断xbox摔不坏的最高楼层层数。比方说,从30层丢下来没问题,但从31层丢下来就不保了。在摸索过程中,允许把两台xbox都砸烂。描述下最坏情况下需要的次数并详细解释你的思路。

(透露一下,这家公司是Epic Games) 

 

===========================================================================================

附几种可行的思路:

1. 网上找到的, 比较符合数学论证的思维, 牛叉

当我们每隔一层楼摔一次的话,那么要摔100 / 1 = 100次
当我们每隔两层楼摔一次的话,需要摔100 / 2 = 50次
当我们每隔三层楼摔一次的话,则需要100 / 3 + 1 = 34次
当我们每隔四层楼摔一次的话,则需要100 / 4 + 2 = 27次
由此可以得出公式:当我们每隔N层摔一次的话,需要100 / n + (n - 2)
这样问题就简单多了,变成了求 (100 + n * n - 2 * n) / n的最小值的问题。
得出n = 10,答案就是每10层楼一摔,摔坏了以后从没坏的那一层开始一层层摔起。。
最坏的时间是要用到100 / 10 + 8 = 18次

 

通用情况下,假设有T层楼,M台XBOX,那么:

这个问题不适合二分法搜索,原因是因为规模有限制,比如说只有2台XBOX就是限制。也就是说,如果是二分法的话,树的层树是受限制的,所以得换一种角度来考虑。

用树的概念来讨论的话,就应该是:
root
/ | -
child1 ...
/ | -
child2 ...
其中树的高度是限制条件。
实际上这个问题就转换成了求每一层树枝的数目的问题了。
在题目中所讲到的100是树的所有节点的总数,2台XBOX是除去根节点不算之外的树的高度。
根据树的性质,完全N叉树是最优的,对于题目来说,就是求100的2次方根,得出结果是10,也就是说,10叉树能够满足最少次数搜索的原则。
用这种方法同样能解出n = 10来。
实际上,我上面的方程:100 / n + (n - 2)
要求N的最小值的话,可以对其求导,得方程:-(10 / n) + 1,根据方程性质可知,当导数为0的时候其值最小。
同样得出结果是10。那么再看那个通用方程的导数:
t / n + (n - m) ; -(sqrt(t) / n) + 1 得出结果竟然和XBOX的台数M没关系。
很显然,我开始犯了一个错误,简单的把问题的规模理解成线性的了。
问题的规模应该是以M为参数的一个指数方程,假设楼层是1000层的话,有3台XBOX, the worst case应该是:
1000 / n + 1000 / n ^ 2 + 1000 / n ^ 3 - 1
恩,这样一来,方程就没问题了,所以这道题的正确的通解方程应该为:
t / (n ^ 1) + t / (n ^ 2) + t / (n ^ 3) + .... t / (n ^ m) - 1
求这个式子的最小值,可以通过对其求导之后,讨论在什么情况下N的值为0来求解。

2. 我的最初想法, 比较感性的思维, 呵呵

从最高层楼/2开始摔, 类似二分查找的思路

 

3.最老实的方法

从1楼开始摔, 如果摔不烂楼层数加1, 直到摔烂它 (因为只有2台XBOX, 摔烂了就没得试了, 所以要谨慎; 其实可以从2楼开始摔的, 因为有两台嘛)