九章算法官网-原文网址
http://www.jiuzhang.com/problem/22/
题目
初阶:有一个100层高的大厦,你手中有两个相同的玻璃围棋子。从这个大厦的某一层及更高的层扔下围棋子就会碎,用你手中的这两个玻璃围棋子,找出一个最优的策略(扔最少的次数),来得知那个临界层面。
进阶:如果大厦高度是N层,你有K个棋子,请问最少需要扔几次可以知道得临界层?
解答
初阶:推导过程如下:首先在第x层仍一个玻璃围棋子,如果碎了,则利用另一个玻璃围棋子依次从1~x-1层试探,查找临界层;如果第x层未碎,则在第x+(x-1)=2x-1层仍一个玻璃围棋子,如果碎了,则利用另一个玻璃围棋子一次从x+1~2x-2层查找临界层,…,这样,可得到表达式:x+x-1+…+1>=100,可得到x=14,即:
先从14层扔(碎了试1-13)
再从27层扔(碎了试15-26)
再从39层扔(碎了试28-38)
再从50层扔(碎了试40-49)
再从60层扔(碎了试51-59)
再从69层扔(碎了试61-68)
再从77层扔(碎了试70-76)
再从84层扔(碎了试78-83)
再从90层扔(碎了试85-89)
再从95层扔(碎了试91-94)
再从99层扔(碎了试96-98)
最后从100层扔(根据题意一定会碎,也可以不扔了)
最坏情况下扔14次。
进阶:
动态规划。设F[N][K]为N层楼,K个棋子最少仍几次。有状态转移方程如下:
F[N][K] = min{max(F[i][K-1]), F[N-i][K])+1, 1<=i<=N}
初始状态下,F[i][1] = i-1 // 如果只有一颗棋子,最坏情况下要从第1层一直扔到第i-1层才能确定(因为第i层一定会碎,不用扔)
时间复杂度O(N^2 * K)