题目:如果你有两个鸡蛋,并且想搞清楚在不摔破鸡蛋的前提下最高能从多高的地方往下扔鸡蛋,你会采取怎样的做法?最优的解决方案是哪种?
解题思维:如果鸡蛋刚好在n层碎掉,那么说明鸡蛋在n-1层不会碎。
设 楼层高度为m层 ,先用第一个鸡蛋在m/2层扔下
1)如果碎掉,即最坏可能,第二个鸡蛋只能从1层到(m/2-1)层继续依次扔下,测试刚好碎掉的楼层n,这样需要操作n次
2)如果未碎掉,则我们再将第一个鸡蛋,再从m/2到m层的中间层进行抛下,重复操作,缩短楼层范围。
代码实现:参考二分法
package test;
import java.util.Date;
public class Eggs {
public int n;//碎鸡蛋楼层
boolean isBreak(int m){//判断鸡蛋在m层扔下是否碎掉
if(m>=n){
return true;
}
return false;
}
int trowsEggs(int p,int q){//楼层范围p-->q
int mid=(p+q)/2;
if(isBreak(mid)){//在中间层抛下第一个鸡蛋,判断是否碎掉
for(int i=p;i<mid;i++){
if(isBreak(i)) {
return i-1;
}
}
}
return trowsEggs(mid,q);//未碎,缩短判定范围
}
public static void main(String[] args) {
Eggs egg=new Eggs();
egg.n=(int)((Math.random())*29999999+1);//随机碎鸡蛋楼层
long time1=new Date().getTime();
int j=egg.trowsEggs(1, 30000000);//计算所得楼层
long time2=new Date().getTime();
System.out.println("鸡蛋在"+j+"层不会摔碎,耗时:"+(time2-time1)+"ms");
}
}