一个有趣的问题,用10只蚂蚁从1000瓶水中找出唯一有毒的一瓶

其实原文说的是10只小鼠,考虑到一些生物伦理问题,小石哥把它换成了10只蚂蚁,可是蚂蚁也是生命。其实不用这么当真的,又不是真的要做这个事。

再具体说一下问题,有1000个装有水的瓶子,其中有一瓶水是有毒的,蚂蚁喝了有毒的水后会在一周的死亡,现在给你10只蚂蚁,和一周的时间,你要从这1000瓶水中找出有毒的那瓶。

作者给出了这样的答案:

把问题简化一下,3只蚂蚁,7个瓶子。

000=0,001=1,010=2,011=3,100=4,101=5,110=6,111=7

把1,3,5,7号瓶子的水给1号蚂蚁喝,2,3,6,7号瓶子的水给2号蚂蚁喝,4,5,6,7号瓶子的水给3号蚂蚁喝。3只蚂蚁对应上面二进制的每一位,如果一周后蚂蚁死了,就把它所在的位置标记为1。

假设1号2号蚂蚁死了3号活着,就是110,对应的是6号瓶子;

依次类推……,就可以找出那个毒瓶子了。由此可见,最少是死一只蚂蚁,最多3只全死。

再回到题目,因为210=1024,所以用10只蚂蚁可以从1023个瓶子里找出有毒的那个,1000个瓶子自然不在话下。

时间: 2024-11-05 12:25:37

一个有趣的问题,用10只蚂蚁从1000瓶水中找出唯一有毒的一瓶的相关文章

C++数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。(牛客剑指offer)

///////////////////////////////////////////////////////// //数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. //例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. //由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. #include <iostream> using namespace std; int Grial(int a[],int n) { if(n==0)return -1;

c语言:输出一个数组,判断是否存在问题,若有,请找出问题并改正

输出一个数组,判断是否存在问题,若有,请找出问题并改正 程序: #include <stdio.h> int main() { int i, a[5] ; for (i = 0; i <=5; i++) { a[i] = 0; } for (i = 0; i <5; i++) { printf("%d\n", a[i]); } return 0; } 结果:出现崩溃 分析:循环的次数超过了数组长度 改正后程序: #include <stdio.h>

C++数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。

#include <iostream> #include <bitset> using namespace std; //数组中超过出现次数超过一半的数字(数组) //题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字. template<int _N> int Grial(bitset<_N> &bt,int a[]) { int check[_N]; for(int i=1;i<=_N;i++) { int count =

【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}, 由于数组中数字2出现了5次,超过数组的长度的一半,因此输出2 一种办法是先把数组排序,那么超过一半的元素一定是数组最中间的元素. 第二种办法比较抽象,设一个变量保存当前值,设一个次数,当前值与下一个值进行比较,如果相等,次数加一,如果不相等,次数减一,如果次数减到0了还是不相等,就把当前值替换掉.代码如下: #include <stdio.h> #includ

一组数据中只有一个数字出现一次,其他数成对出现,找出这个数

一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的,请找出这个数字. (使用位运算) 直接使用异或运算. 代码如下: #include<stdio.h> #include<stdlib.h> int main() { int arr[]={3,5,9,2,5,3,2};  int size=sizeof(arr)/sizeof(arr[0]); int i=0,find=0; for(;i<size;i++) { find^=arr[i];//循环进行异或运算 }

数组中有一个数字出现的次数超过了数组长度的一半,找出这个数

这个算法的时间复杂度是O(n),另外用了两个辅助变量. k用于临时存储数组中的数据,j用于存储某个数出现的次数. 开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k 因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数. 下面这个算法只适合数组中数组中某个数的出现次数超过数组长度一半的数组,符合题意. c实现 1 #include<stdio.h

请从L=[1,10,20,50,20,20,1]中找出重复数。

1 L=[1,10,20,50,20,20,1] 2 L1=[] 3 for i in L: 4 if(L.count(i)>1): 5 L1.append(i) 6 L2=[] 7 for i in L1: 8 if i not in L2: 9 L2.append(i) 10 print L2 原文地址:https://www.cnblogs.com/Python-XiaCaiP/p/8521517.html

一个有趣的天平秤球问题

最近在网上看到一个题目,题设简单明了,本以为解决起来相当简单,细想之下却是有一定难度.这个题的题意如下:12个外观一致的球,其中只有一个重量不同,要求使用天平称重3次即找出这个不同重量的球并判断其较重还是较轻. 继续阅读下文之前建议大家先尝试思考一下解决方案. 读者朋友可能在尝试了几种方案之后仍然无法解决,当然有条件的话大家可以通过实物去试验每一次称重,比较直观.下面我提供一个计算机的小程序(C语言编写)来模拟题目中的天平称重,其实也可以当成是一个趣味小游戏来玩玩.?   #include <s

LeetCode&mdash;&mdash;Single Number II(找出数组中只出现一次的数2)

问题: Given an array of integers, every element appears three times except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?   Single Number I 升级版,一个数组中其它数出现了