天天看點

k個雞蛋從N樓層摔,如果确定剛好摔碎的那個樓層,最壞情況下最少要試驗x次?

逆向思維和數學公式解。

題目

k個雞蛋從N樓層摔,如果确定剛好摔碎的那個樓層,最壞情況下最少要試驗x次?

換個說法:

k個雞蛋試驗x次最多可以檢測N層樓。計算出N?

分析

定義N(k,x)

如果第k個雞蛋碎了,則

還剩k-1塊雞蛋.

下一次隻需檢查下面的樓層.

還剩x-1次機會.

如果第k個雞蛋沒有碎,則

還剩k塊雞蛋.

下一次隻需檢查上面的樓層.

N(k,x) = 1 + N(k-1,x-1) + N(k,x-1)

初始值

N(k,1)=1 N(1,x)=x

代碼如下:

空間複雜度O(k)

時間複雜度O(k*lnN)

int solution(int n, int k) {
    int bs = log2n(n) + 1;
    if (k >= bs) {
        return bs;
    }
    int* dp = new int[k];
    for (int i = 0; i < k; i++) {
        dp[i] = 0;
    }

    int r = 0;
    while (1) {
        r++;
        int p = 0;
        for (int i = 0; i < k; i++) {
            int tmp = dp[i];
            dp[i] += (p + 1);
            p = tmp;

            if (dp[i] > n)
                return r;
        }
    }
}
           

數學公式解

當k确定,可以計算出N的公式解N(x)。

  1. 級數求和。k越大,計算量越大。
  2. 多項式拟合。計算量較小,比較簡潔的方法。

可以算出結果:

k=1 N=x

k=2 N=(x2+x)/2

k=3 N=(x3+5x)/6

k=4 N=(x4-2x3+11x2+14x)/24