问题:
奥林匹克大厦楼层高100层,当楼层低时,从楼上扔下鸡蛋不会碎,当楼层高时,从楼上扔下鸡蛋会破碎。现在你有两个鸡蛋,你扔多少次,可以计算得出鸡蛋不会碎的楼层?(除去任何因素,牛顿的棺材已经派人按住了)
- 方式一:
- 从一层开始扔,每层递增,那么每次增加1,最多试100次就出结果了。
- 结果:最少1次就碎,最多100次碎。
- 既(1, 100)
- 方式二:平衡二叉树法
- 每次取中间值楼层,如:50,25,13,7,4,2,1。
- 如果第一次取50碎了,那说明临界点在50以内,就剩下一个鸡蛋,又开始第一种方式。
- 既(7, 50)
- 为了最优反向取,如:1,2,4,7…...。最优1次就碎,最差75碎了,50没碎,那么就是(1,8+24)。
- 既(1, 32)
- 方式三:
- 假设我从N层扔,每次楼层一样,那么:N x N >= 100, N取10层,如:10,20,30,40......100,一共10份。
- 如果第一次扔10碎了,说明区间在1到10直接。最差的结果在100层扔碎了,区间在91层到99层之间。既(1+9, 10+9)。
- 既(10, 19)
- 方式四:最优方案
- 通过上面三种方式,有没有一种感觉,就是如果想让扔的最大次数最小化,既让最小的数字最大化,也既最大次数和最小次数之间的差最小。则:N + (N-1) + (N-2) + ...... + 1 就是数列求和公式 N(N+1)/2。
- N(N+1) /2>= 100 ,N=13.65,约14。 第一次在14楼扔蛋,第二次14+13=27楼扔,以此类推。如:14,27,39,50,60,69,77,84,90,95,99,100
- 最多扔1+13次,最少扔12次。
- 既(14, 12)。
结论
- 小朋友别拿家里的鸡蛋去试了,小心砸到人。
- mysql数据库的二叉树方式不是最优的查询方式(针对单条查询,范围查询就算了)。
- 如果楼高确定,手里的鸡蛋数量不确定,你会怎么算呢?
- 递归