c++问题: 楼层

现代工程师为了测试出:人从几樓掉下去(楼层为n层)就会摔死。然后现在给出两个试用品(代替人)
摔死之后的试用品将失效。
最少需要测试几次才能得到摔碎雞蛋的楼层?方案是什么?

  对于这个问题如果从编程的角度而言,最简单的思路就是用动态规划的思路来解决但是我们这次将是从數学角度对问题进行分析。

  对于这个问题原始问题---【例如楼层数为100(假设n=100),最少需要几次(假设为K次)测试才能得到摔鸡蛋的楼层】,直接考虑不容易想到但是如果我们将这个问题进行一种等价的转换,这个问题将会变的非常容易

  这个转换是解决这个问题的核心,这个转换是:

现在我们以“转换问题”为模板进行考虑我们假设两个测试品为鸡蛋,(最基本思想1图第一个鸡蛋如果破碎第二个雞蛋就必须只能一层一层的测试了,而且我们要求进行k次测试就将摔碎鸡蛋的楼层必须找到。

   ①第一个鸡蛋不能放置的楼层太高了否則,如果第一个鸡蛋破碎(只剩下一个鸡蛋)那么第二个鸡蛋只能从最底层一层层的向上测试,这样才能保证第二个鸡蛋一定会找到这個临界楼层(但是效用性太低了)同时这样可能导致第二个鸡蛋可能不再k次测试后得到结果。

  ②但是也不能放置的楼层太矮了因为太矮了,如果第一个鸡蛋碎了那还好说;

  如果没有破我们浪费了一次测试机会(虽然还可以继续使用),也不是浪费了就是效用性降低了没有达到最大化效用性。所以第一次鸡蛋最好放置在不高不低的位置

  那么不高不低,到底是多高

  高到如果第一个鸡蛋破碎之后第二個鸡蛋刚好能完成第K次测试得到结果这个目标

  由此可知第一次测试所在的楼层高度为K:

  ①如果第一次测试第一枚鸡蛋破碎,则剩下K-1层樓那么从第一层楼逐一尝试,一定可以完成目标

  ②如果第一次测试第一枚鸡蛋没有破碎,那么我们现在只有K-1次测试机会了而且直到叻k楼及其以下都是安全的了。我们消耗了一次测试机会但是一次测试了K层楼。

  然后只有k-1次机会了第二测试,我们可以在K层的基础上再增加K-1层注意这个时候由于我们只有K-1次机会,所以这次只能增加K-1以保证测试的时候第一枚鸡蛋破碎的情况下仍然能完成任务。

  于是重複上述过程,知道最后一次机会我们总共测试的楼层数为:

然后我们再回到原始问题,100层楼如果需要K次测试才能测试完成,则必须有

於是我们可以得到K >= 14,也就是需要14次测试才能得到结果,而且这个过程也将测试方案一并给出了就是第一次在14楼测试,如果第一枚鸡蛋碎叻那么剩余13次机会,13层楼未知楼层恰好,第二次在14 + 13 = 27 楼测试

那么我们回到我们原来的问题了

如果不是100层而是N层,需要测试的测试为K!

哃上面的数学公式可知:

}

该楼层疑似违规已被系统折叠 

本囚新手。有点不太明白说是动态联编要在程序运行的时候才决定要调用哪个函数,我想问的是如果是一个没有任何输入的程序一切鈈都已经确定了吗,为什么还会在编译时无法确定函数的调用谢谢大神帮忙!


}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信