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;
}
}