丢棋子问题

【题目】

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值