【题目】
给定整数N作为楼层数(地面是0层),整数K是棋子数,返回如果想找到棋子不会摔碎的最高层数(从0层掉落肯定不会碎,第i层可能会可能不会)。
即:在最差的情况下扔的最少次数。
一次只能仍一个棋子。
【例子】
N=10,K=1,返回10.
最差情况下,第10层是不会摔碎的最高层,棋子从1层试到10层
N=3,K=2,返回2
先在2层仍一颗棋子,碎了试1层,没碎试3层
N=105,K=2,返回14
【代码】
public class demo {
public static void main(String[] args) {
//System.out.println(Chess(10,1));//10
//System.out.println(Chess(3,2));//2
System.out.println(Chess(105,2));//无响应,系统容易崩溃
}
//丢棋子问题
public static int Chess(int nLevel,int kChess){
if(nLevel<1||kChess<1){//楼层0层,或棋子0个
return 0;
}
return Process(nLevel,kChess);//暴力递归
}
public static int Process(int nLevel,int kChess){
if(nLevel==0){
return 0;
}
if(kChess==1){//只有一个棋子,最坏的情况:只有挨个楼层试,试完才找到
return nLevel;
}
int min=Integer.MAX_VALUE;
for(int i=1;i<=nLevel;i++){
min=Math.min(min, Math.max(Process(i-1,kChess-1),Process(nLevel-i,kChess) ));
}
return min+1;
}
【说明】
对于一般情况(N>0,K>1),如果第一颗棋子从i层开始扔,
1)碎了。则接着试i层以下,剩下i-1层楼,剩下k-1棋子,
总次数为1+P(i-1,k-1)
2)没碎。则接着试i层以上,剩下N-i层楼,K个棋子,
总次数为1+P(N-i,k)
最坏情况:max{P(i-1,k-1),P(N-i,k}+1
扔的最少次数:min{max{P(i-1,k-1),P(N-i,k}}+1
(1<=i<=N)
该方法为暴力递归方法,时间复杂度为O(N!),
好理解,但损耗过多资源,不推荐
可是其他方法看着好难啊….