毒药水问题,枪毙犯人问题(二进制思想)

毒药水题目大概描述:
有1000瓶药水,其中有一瓶是有毒的,用现有的老鼠来验证哪一瓶是有毒的?
思路:
1.二分法:最多需要log(2)1000
2.多分法,比如每次三个分为一组:1000–>(333,333,334)—>111->37->(12,12,13)->(4,4,5)->(2,2,1) -> 1
3.转化为二进制来测试:仅需十位二进制就可以表示十进制1-1024的值,
所以一千只老鼠,用十位二进制就可以表示出来。
实现步骤:
(1)给定十只老鼠,将他们从1-10进行编号;
(2)将这一千瓶药水用二进制编号:从000 000 0001到 111 110 1000;
(3)这一千瓶药水的第几位编号是一,就让哪只老鼠去喝,比如,第一瓶药水的第十位是1,那么就让编号是10的老鼠去喝;第一千瓶同时让第1,2,3,4,5,7老鼠去喝,根据死去的老鼠进行还原,就可以知道是哪一瓶有毒了。

枪毙犯人:
问题描述:有一百个犯人,从头到尾报数,报数为奇数的人枪毙,偶数的人留下,如此循环,最后只留下一人,问本来站在第几位的人没有被枪毙
思路:
一百用七位二进制就可以表示
所以第一轮枪毙时:用七位二进制表示一百个数,枪毙最后一位是一的;
第二轮:人数减少一半,用六位二进制就可以表示,枪毙此时最后一位是一的
.
.
.
那么最后只剩下第一位是一的留下,他刚开始的二进制表示为:100 0000
2^6=64
所以刚开始站在第64位才可能被留下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值