問題:
腾讯大厦有39层,你手里有两颗一抹一眼的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。大厦有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,
* 等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式来确定临界楼层
解決方法
用户随机选一层i,扔下去,有两个结果:
碎掉,或者没有碎掉。
1.如果碎掉,去试验前i-1层,那么最多需要i-1次再加上碎掉的那一次,最多就是i次。
2.如果没有碎掉,等于说从第i+1层往后,也还是有两个弹珠,这就回到了递归的思路上了。
在这种没有碎掉的情况下,假如总共有N层,那么N层的最多次数等于N-i层的最多次数。所以
针对用户随机选择的这一层i, 以上1和2两种情况, 求其最大值就是最差情况下的次数。
用户随机选择的这个i,也可以变化的,取值 1,2,3...N. 那么我们就会得到不同的值。
针对1,2,3...N. 会有N个,所有这些值中取最小,就是最优解。 用F(N)表示这个最优解,那么F(0)由于没有楼层,所以一定等于0,也就是说不需要实验。
F(0) = 0;
F(N)= min(max(1, F(N-1) + 1), max(2, F(N-2)+ 1)... max(N, F(0)+ 1))
F(0) = 0;
F(1) = 1;
F (2) = min(max(1, F(1)+ 1), max(2, F(0) + 1)) = 2;
可以使用递归算法求得其值,最终的结果是9次。
下面是代碼
package interview;
import java.util.ArrayList;
public class ThrowPinballFrom30Layer {
/**
* 腾讯大厦有39层,你手里有两颗一抹一眼的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,一定会有两个结果,玻璃珠碎了或者没碎。大厦有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,
* 等于或高于它的楼层,扔下玻璃珠,玻璃珠一定会碎。玻璃珠碎了就不能再扔。现在让你设计一种方式,使得在该方式下,最坏的情况扔的次数比其他任何方式最坏的次数都少。也就是设计一种最有效的方式来确定临界楼层
*
* @param 39
* layer
* @return the optimal step for the first ball.
*/
public static int getOptimalStep(int N, int[] results, int[] selection) {
if (N == 0) {
results[N] = 0;
return 0;
}
if (results[N] >= 0) {
return results[N];
}
int selectedIndex = 0;
int min = -1;
for (int i = 0; i < N; i++) {
int max = Math.max(i + 1, getOptimalStep(N - i - 1, results, selection) + 1);
if (min < 0) {
min = max;
selectedIndex = i;
} else {
if (min > max) {
selectedIndex = i;
min = max;
}
}
}
//System.out.println("N = " + N + ", selectedIndex = " + selectedIndex);
selection[N] = selectedIndex;
results[N] = min;
return min;
}
public static void main(String[] args) {
int N = 39;
int[] results = new int[N + 1];
for (int i = 0; i < results.length; ++i) {
results[i] = -1;
}
int[] selection = new int[N + 1];
System.out.println("optimal steps:" + getOptimalStep(N, results, selection));
ArrayList<Integer> steps = new ArrayList<>();
int leftCount = N;
int pSelected = 0;
while (true) {
if (leftCount <= 0) {
break;
}
pSelected = pSelected + selection[leftCount];
steps.add(pSelected);
pSelected = pSelected + 1;
leftCount = N - pSelected;
}
StringBuilder sb = new StringBuilder();
sb.append("selections:");
sb.append("[");
for (int i = 0; i < steps.size(); ++i) {
if (i != 0) {
sb.append(",");
}
sb.append(steps.get(i) + 1);
}
sb.append("]");
System.out.println(sb.toString());
}
}
打印結果:
optimal steps:9
selections:[3,11,18,24,29,33,36,38,39]
完畢
分享到:
相关推荐
"企业微信大型企业办公解决方案" 根据提供的文件信息,本解决方案旨在解决大型企业办公中的各种痛点,通过企业微信强大的专业办公管理和连接能力,将园区软件、硬件、服务、实现统一的解决方案。 园区概况 西安...
- 这一时间点的面试记录反映了当时的面试标准和流程,可能包括了面试的常见问题,如自我介绍、项目经验分享、问题解决案例等。 - 面试者在面试过程中的表现,尤其是面对挑战和压力时的反应,可能会被详细记录下来...
在腾讯北京总部的建设中,这种技术有助于提前预见并解决潜在的施工问题,优化资源配置,有效控制成本。 4. **施工过程中的碰撞检测**:在施工前,BIM可以进行碰撞检测,发现不同专业之间的设计冲突,避免了在实际...
总的来说,腾讯滨海大厦的超高层建筑核心筒后施结构防护平台的研制,充分展示了QC小组如何通过系统的方法解决实际工程难题,体现了技术创新在建筑工程中的关键作用。这一成果不仅提高了施工安全性,也推动了超高层...
- **变更、图纸差异等的处理要求**:对于设计变更或施工过程中出现的问题,规定了解决方案和审批流程。 6. **物资管理规定** - **材料品牌报审**:要求分包商提交拟使用材料的品牌和规格,经过审核后方可使用。 ...
例如,利用FAX/MODEM和特定的通讯软件,可以实现计算机与远程计算机或传真机之间的信息交换,这种解决方案操作简便,传输速度快,为无法直接接入Internet的用户提供了解决之道。 总之,现代计算机技术在办公自动化...
智慧监所三维可视化管理平台主要汇聚了数字化企业的运维数据,...通过这种方式,智慧监所三维可视化管理平台提供了一个综合性的解决方案,可以极大地增强监所的安全性、提高管理效率,并有助于实现社会安全稳定的目标。
梯影传媒推介书2.0.pdf 文件中涵盖了梯影传媒的详细介绍,包括公司定位、运营模式、媒体形式...梯影传媒不仅构建了一个全方位、高效率的媒体网络,同时也在技术和内容营销上不断创新,为广告主提供精准的营销解决方案。
2021智慧城市优秀案例集汇聚了全球各地的优秀实践,展示了一系列智慧城市解决方案。 【交通工程】在交通工程方面,案例集提到了几个亮点项目。如广州市的“穗智管”城市运行管理中枢,通过智慧城市建设,助力城市疫...
北京国际智能家居博览会(以下简称CEE)是森展国际展览有限公司旗下的知名展览品牌,系第十九届北京电博会主题展之一,于2002年创办,行业号称630北京智能家居展,CEE是亚洲顶尖的高新技术产品及解决方案的展示平台...