丢棋子问题
描述
一座大楼有0~N层,地面算作第0层,最高的一层为第N层。已知棋子从第0层掉落肯定不会摔碎,从第i层掉落可能会摔碎,也可能不会摔碎(1<=i<=N)。给定整数N作为楼层数,再给定整数K作为棋子数,返回如果想找到棋子不会摔碎的最高层数,即使在最差的情况下扔的最小次数。一次只能扔一个棋子。
解题
/**
* 楼层扔棋子
*/
public class Solution {
public static void main(String[] args) {
Solution s=new Solution();
int t=s.solve(3,2);
System.out.println(t);
}
public int solve(int n,int k){
if (n<=1||k==1) return n;//楼层为0则0次 棋子为1则楼层总数
int best=(int) (Math.log(n)/Math.log(2))+1;//棋子数不限时的最少扔的次数
if (k>best) return best;
int[] dp=new int[k];//存储k个棋子时每扔一次能抵达的最高楼层
int res=0;
while (true){
res++;//次数增加
int previous=0;//存储第res-1次k-1个棋子能扔的最高楼层
for (int i = 0; i < dp.length; i++) {
int tmp=dp[i];
dp[i]=dp[i]+previous+1;
previous=tmp;
if (dp[i]>=n){
return res;
}
}
}
}
}