丢棋子问题
来源:互联网 发布:打电话软件下载 编辑:程序博客网 时间: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!),
好理解,但损耗过多资源,不推荐
可是其他方法看着好难啊….
阅读全文
0 0
- 丢棋子问题
- 其他题目---丢棋子问题
- 取棋子问题
- 百层楼扔棋子问题
- 棋子移动问题
- 取放棋子问题
- 算法:棋子移动问题
- 堆棋子问题
- 抛玻璃棋子的问题
- poj- 1321-棋子问题-dfs
- Matlab取棋子博弈问题
- 棋子
- 棋子
- 国际象棋的棋子步数问题
- Node:状压DP-1(棋子问题)
- SDAU练习三 1003 棋子跳跃问题
- 51Nod-棋子游戏(博弈问题)
- [创新杯] 七个黑白棋子 跳棋问题 ,怀念实验室里和老师摆弄棋子的校园生活.
- 主要空间数据挖掘方法
- oracle 解析soap报文XML报错
- Java Thread线程基础总结
- 说说ES6 Class里面的this对象
- Alpha,Beta,RC,GA版本解释
- 丢棋子问题
- oracle下mybatis批量下载的问题
- Python生成PASCAL VOC格式的xml标注文件
- Android用标注管理数据库的简单示例
- .net总结(二)
- Improving Linux kernel networking performance 笔记
- Android 开发之漫漫长途 Ⅲ—Activity 的显示之 Window和View(2)
- HTTP(三)
- expected unqualified-id before '(' token