烧脑子计算

来源:互联网 发布:新手怎么来淘宝 编辑:程序博客网 时间:2024/04/30 07:19

问题

请诸位为乌有国王出个主意:500桶酒,其中1桶是毒酒;48小时后要举行酒会;毒酒喝 下去会在之后的第23-24小时内毒死人;国王决定用囚犯来试酒,不介意囚犯死多少,只要求用最少的囚犯来 测试出哪一桶是毒酒,问最少需要多少囚犯才能保证找出毒酒?如你们没做过,欢迎大家动动脑筋。

今天偶然看到高中群有这么一道题,想了许久没有什么很好的思路。但是高中那一群变态、非人类,竟然做了出来。

首先有一个思路是这样的: 根据题目可以知道,国王只有两次试酒机会,也就是两次就要把酒给找出来。所以就有了如下的思路。就是一个人品尝20桶(当然,只是喝一口)需要25个人,在大约24小时后,会有一个人中毒死掉,剩余的24个人把死了的那个人喝掉的20桶酒,一人品尝一桶,再过24小时就可以找出有毒的那桶酒; 大家可能看了出来,24个人大于定位出来的20桶酒。所以理论上讲是不需要那么多人的,那么到底需要多少人呢?

我自己总结了下:

第二轮是务必测试出毒酒的: 这里又分两种情况:
1. 所有的囚犯都没有死,那就是毒酒在剩余的酒中,所以 X>=500-X·Y-1
2.假如,有一个囚犯死去。那么该囚犯所测试的Y桶酒中有毒,那么剩余的X-1个囚犯数量是要大于等于Y-1的。 即:X-1>=Y-1
A)X>=500-X·Y-1
B)X-1>=Y-1

计算到这里,大家是不是很开心呢,感觉这个问题已经解决了? 其实我想说,我们忽略了一个重要的条件
——>48小时后举行酒会,23~24小时内毒死人的条件!!!!!

所以正确的做法是这样的: 大家应该都知道平面直角坐标系吧,在同一平面内只需要两个值(X,Y)就可以确定一个具体位置。
这个思路就跟这句话有关!

把这些酒编号:
1,2,3,4…….499,500;分为22组,每组23桶酒。

1,2,3,4,5,6,7,8,9………………..20,21,22,23;
24,25,26………………………………….44,45,46;
47,48……………………………………….67,68,69;
………………………………………………………………
……………………………………………………………..
461,462……………………………………482,483;
484,485,486……………………498,499,500;

大概就能得出这么一个类似正方形的二维数组,因为22X23>500,所以500桶酒肯定可以都放上去。接下来就是最关键的了:

刚才提到平面直角坐标系,只需要两个值就能判定其具体位置。那么这道题最终结果就是只需要两个囚犯即可。 (假设是A囚犯与B囚犯)

思路:
共有48个小时的时间供我们挥霍,我们先用前24小时:
第1个小时A囚犯把第1行喝掉,第2小时把第2行喝掉。。。以此类推;
同时,B囚犯第1小时把第1纵行喝掉,第2小时把第2纵行喝掉。。。以此类推;

前24小时把酒都喝完,我们只需要知道两名囚犯的死亡时间就可以推断出那桶酒的位置。

只能感叹数学真是太伟大了,思维是如此的重要!

这里也可以继续扩展,假如有1000桶酒该怎么算?或者更多?自然而然的我会想到三维、四维空间的只是去解决!甚至是多维空间,用Java的多维数组去思考,我想应该会很好理解,也为自己提供了一个不一样的思路!

0 0
原创粉丝点击