8瓶药水3只小白鼠问题

百度推送了一个题目:
7瓶药水一瓶有毒,三只小白鼠,毒药发作一小时时间。问题:如何在一小时的时间内找出毒药水。

笔者看题后,感觉很有意思,并隐隐感觉可以做出来。经过一番思考,最终得解。 下面给出出思考过程:

根据题目要求,小白鼠只能喝一次药水,因此问题就简化成:如何配比这些药水,通过小白鼠的死活状态来判断毒药水。

1、首先想到,其实测试6瓶就可以了。(自己想想为什么)
小白鼠喝的饮料必然是某种组合,而这种组合可以表征毒药水的位置。

2、为了方便起见,将毒药水编号为1-7, 小白鼠编号为ABC。

3、如果只有三瓶药水,那么可以这样分配
A(1),B(2),C(3),这样一次就可以测出毒药水了。
4、 如果有四瓶呢?
第四瓶必然要和上面的混合,混合方法只有三种方式
4.1 A(1,4),B(2),C(3):这种情况如果是A 死, 则不能判断,淘汰…
4.2 A(1,4),B(2,4),C(3):这种情况如果是:A死B死则可以判定4 是毒药水…
4.3 A(1,4),B(2,4),C(3,4):都死,4是毒药水…
显然4.3浪费了一次机会,淘汰,这样4.2 是尝试方向。
(思考…)
5、根据上面的思路,考虑用 1 表示死,0 表示活, 得出解法如下
药水组合方案(括号内表示药水组合编号):
A(1,4,6),B(2,4,5),C(3,5,6)

对应结果和判断

在这里插入图片描述
6、 发现如果组合如下:
A(1,4,6,7),B(2,4,5,7),C(3,5,6,7)
则可以判断8瓶药水,判断结果如下:

在这里插入图片描述

是记
马拉孙于2021-07-20
北京泛五地区

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个用Java编写的解决方案: ```java import java.util.ArrayList; import java.util.List; public class PoisonTesting { static void main(String[] args) { int numBottles = 10; int numDays = 8; int numMice = 4; int[][] testMatrix = generateTestMatrix(numBottles, numDays); int poisonedBottle = runTests(testMatrix, numMice, numDays); System.out.println("The poisoned bottle is: " + poisonedBottle); } // 生成测试矩阵 public static int[][] generateTestMatrix(int numBottles, int numDays) { int[][] matrix = new int[numDays][numBottles]; for (int i = 0; i < numDays; i++) { int value = 1 << i; for (int j = 0; j < numBottles; j++) { if ((j & value) != 0) { matrix[i][j] = 1; } } } return matrix; } // 运行实验,找出毒药所在的子 public static int runTests(int[][] testMatrix, int numMice, int numDays) { List<Integer> aliveMice = new ArrayList<>(); for (int i = 0; i < numMice; i++) { aliveMice.add(i + 1); } for (int day = 0; day < numDays; day++) { List<Integer> survivedMice = new ArrayList<>(); for (int mouse : aliveMice) { if (testMatrix[day][mouse - 1] == 1) { survivedMice.add(mouse); } } aliveMice = survivedMice; } return aliveMice.get(0); } } ``` 这个程序通过生成一个测试矩阵,并使用逐日实验的方式来确定哪药是毒药。首先,使用`generateTestMatrix`方法生成一个大小为`numDays x numBottles`的测试矩阵,矩阵中的每个元素代表对应的小鼠在对应的日子是否喝了对应的子的药水。然后,使用`runTests`方法在每一天根据测试矩阵筛选出活下来的小鼠,并将它们作为下一天的测试对象。最后,返回活下来的最后一只小鼠所在的子编号,即为毒药所在的子。 请注意,这只是一种解决方案,并且假设小鼠对于毒药没有任何免疫力。实际情况可能更加复杂,具体的解决方案可能会有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值