class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回最差情况下扔棋子的最小次数
     * @param n int整型 楼层数
     * @param k int整型 棋子数
     * @return int整型
     */
    int solve(int n, int k) {
        // write code here
        if(n <= 1 || k == 1) return n; 
        int best = log2(n) + 1; // 优化,最优情况下,需要的最少次数
        if(k > best) return best;
        int dp[k + 1]; // 用来记录1-k个棋子能探测的最大层数
        for(int &i : dp) i = 1; // 扔一次只能探测一层
        for(int time = 2; ; time++) { // time指扔了几次
            int temp = dp[1]; // 保存前一次扔棋子结果
            for(int i= 2; i <= k; i++) {
                int previous = temp;
                temp = dp[i];
                dp[i] = dp[i] + previous + 1;
                if(dp[i] >= n) 
                    return time;
            }
            dp[1] = time;
        }
    }
};