[面试题] 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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() 条件判断 赋值问题