毒药与老鼠-程序实现

有 N个一模一样的瓶子,其中有 N-1瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。问你需要有多少只小白鼠和一星期的时间,来检验出哪个瓶子里有毒药?怎么检验?编程实现检验过程。

编程思路:

设瓶子个数为N,根据我另一篇博文可知老鼠不能少于ceiling(log(N))只,首先编程得到老鼠的数量K,然后模拟老鼠吃药的过程,最后根据老鼠的死亡情况可以得到瓶子的编号。

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
/*
B中为true的那个是有毒的瓶子
*/
int findPoisonBottle(vector<bool> B) {
	int index = 0, K = 0, size; //size临时存瓶子的数量 K是老鼠的数量
	vector<bool> status;
	size = B.size();
	while(size) {
		K++;
		size >>= 1;
	}
	status.resize(K, false);
	for(int i=0; i<B.size(); i++) {
		int bottleIndex = i;
		int mouseIndex = 0;
		while(bottleIndex) {
			//模拟老鼠喝药水的过程
			if(bottleIndex & 0x1) 
				status[mouseIndex] = B[i] || status[mouseIndex];
			bottleIndex >>= 1;
			mouseIndex++;
		}
	}
	//从老鼠死亡情况推出瓶子的编号
	for(int i=1; i<=K; i++) {
		index <<= 1;
		if(status[K-i])
			index |= 0x1;
	}
	return index;
}

int main() {
	vector<bool> B(1000, false);
	B[809] = true;
	cout << findPoisonBottle(B) << endl;
	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值