毒药水题目大概描述:
有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位才可能被留下。