M個軟硬程度一樣但軟硬程度未知的雞蛋,它們有可能都在第一層樓就摔碎,也可能從一千層樓摔下來沒事。有座N層的建築,要你用這M個雞蛋確定哪一層是雞蛋可以安全落下的最高層數。可以摔碎這M個雞蛋,但碎了就不能再拿來測試了,沒碎的可以重複仍。樓層高度地面爲0層。你的任務是求出,保證在最壞情況下(因爲比如只有一個雞蛋,只好從低往高仍,否則破了就不能準確求問題的解),也可以求出問題的解的最少仍雞蛋次數。比如: 1個雞蛋 n層樓,最壞情況最少要扔n次。100層樓 2個雞蛋 最壞情況最少要14次。摘自算法第4版課後練習。 google面試題。
輸入格式:
第一行給出組數N,後面的每一行爲 雞蛋數M ,樓層數K。 N,M,K 都是正整數, 且都不大於1000。
輸出格式:
每行依次輸出每組輸入的最小仍雞蛋次數。
輸入樣例:
在這裏給出一組輸入。例如:
3
2 100
1 10
10 100
輸出樣例:
在這裏給出相應的輸出。例如:
14
10
7
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 1e9 + 5;
int dp[1001][1001] = { 0 };
int main() {
int T, M, K;
cin >> T ;
while (T--) {
cin >> M >> K;
for (int i = 1; i <= K; i++)
dp[i][1] = i;
for (int j = 1; j <= M; j++)
dp[1][j] = 1;
for(int i=1;i<=K;i++)
for (int j = 2; j <= M; j++) {
dp[i][j] =INF;
for (int k = 1; k <= i; k++)
dp[i][j] = min(dp[i][j], 1 + max(dp[k - 1][j - 1],dp[i - k][j]));
}
cout << dp[K][M] << endl;
}
}