[面试题] 100层楼扔2个鸡蛋,不确定鸡蛋硬度,求最优解。

100层楼扔2个鸡蛋,不确定鸡蛋硬度,求最优解。 + 2000m火车拉煤 + 夜晚大桥,一个手电筒来回

100层楼有2个鸡蛋,需要确定个条件,
1: 把100层楼分多少次,
2: 每次最多有多少层

比如100层, 我分10片, 每次10楼

最坏情况 就是 9(层) + (10-1)(知道第99层没坏,就知道是第100层)

分m片
每片n层

m*n= 100;
求m+n 最小值

a[m][n]

a[10][10] 这样最多试是 9+10-1= 18次

a[11][]

有限层数和蛋数,求即使最坏情况下需要的最少判断次数
两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置。可以摔碎两个鸡蛋。(参见[两个鸡蛋--一道Google面试题])

这是典型的动态规划问题。假设f[n]表示从n层楼找到摔鸡蛋不碎安全位置的最少判断次数。假设第一个鸡蛋第一次从第i层扔下,如果碎了,就剩一个鸡蛋,为确定下面楼层中的安全位置,必须从第一层挨着试,还需要i-1次;如果不碎的话,上面还有n-i层,剩下两个鸡蛋,还需要f[n-i]次(子问题,实体n层楼的上n-i层需要的最少判断次数和实体n-i层楼需要的最少判断次数其实是一样的)。因此,最坏情况下还需要判断max(i-1,f[n-i])次。

状态转移方程:f[n] = min{ 1+max(i-1,f[n-i]) | i=1..n }
初始条件: f[0]=0(或f[1]=1)

int min_testnumber(int d, int e)
{
int **f=new int *[d+1];
int i,j,k;
for(i=0;i<=d;i++)
f[i]=new int[e+1];
for(i=0;i<=d;i++)
f[i][1]=i;
for(i=0;i<=e;i++)
f[0][e]=0;
for(i=1;i<=e;i++)
{
for(j=1;j<=d;j++)
{
int tmp;
int min_test=0x7FFFFFFF;
for(k=1;k<=j;k++)
{
tmp=f[j-k][i]+1>f[k-1][i-1]+1?f[j-k][i]+1:f[k-1][i-1]+1;
if(tmp<min_test)
min_test=tmp;
}
f[j][i]=min_test;
}
}
int result=f[d][e];
for(i=0;i<=d;i++)
delete[]f[i];
delete[]f;
return result;
}

100层,2个鸡蛋。

100,2 = 14

posted @   scott_h  阅读(1362)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2015-10-18 [面试题] for() while() 条件判断 赋值问题
点击右上角即可分享
微信分享提示