丢棋子问题

来源:互联网 发布:打电话软件下载 编辑:程序博客网 时间:2024/05/21 14:47

【题目】

给定整数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!),
好理解,但损耗过多资源,不推荐
可是其他方法看着好难啊….

原创粉丝点击