1、现有1000个苹果,10个盒子,现在要你将1000个苹果装入10个盒子中,使得用户无论购买多少个苹果(1-1000),都能由若干个盒子拼装而成(卖的时候是整个盒子卖,不能拆盒子的包装)。
解法:使用二进制,每一个盒子装1个(0000000001),第二个盒子装2个(0000000010),第三个盒子装4个(0000000100),第四个盒子装8个(0000001000),第五个盒子装16个(0000010000),第六个盒子装32个(0000100000),第七个盒子装64个(0001000000),第八个盒子装128个(0010000000),第九个盒子转256个(0100000000),第10个盒子装512个(1000000000)。这样对于1-1000内的任意数字都可以用不超过十个盒子来表示了。
显然这道题有很多种解法,比如简单的(1,2,3,4,5,6,7,8,9,10也可以表达出1-1000内的任意数字)。但是使用二进制是最优解吗?最优应该定义为平均所需要的盒子最小吧。
2、有1000瓶液体,无色无味,外表完全一样,其中一瓶是毒药,有10条警犬,警犬喝过毒药后两小时后死亡。问,如何在两个小时后确定哪瓶是毒药。
解法:1000瓶毒药编号0-999,显然用十位二进制可以表示1024中状态,当然就可以编码这1000瓶毒药了,十条警犬正好对应着十位二进制位。现在我们的策略是这样的:将警犬按1-10编号,编号 i 的警犬喝下毒药编码中第 i 位为1的所有毒药,这里最苦逼的就是编号为1的警犬了,因为它要喝下编号为1,3,5,7....999,一共500瓶毒药(这里不考虑它能不能喝下的问题了)。两个小时后,统计警犬的死亡情况,假如:第2,4,7,10,号警犬死了,那么显然毒药的二进制编号在第2,4,7,10位为1(因为这四条警犬都喝到了这瓶毒药,且死亡了),在第1,3,5,6,8,9位的二进制编码为0。所以毒药的二进制编号为:1001001010(十进制编号为586),这样我们就找到了这瓶毒药了。
其实,这一题我们还可以扩展一下,比如说,1000瓶里面有2瓶是毒药,或者3瓶,4瓶....应该怎么来解决呢?
我们以两瓶为例:从1000频里面选2瓶的一共有=1000 * 999 / 2 = 249500(111100111010011100)需要用18位二进制位来表示这个数组,那么我们可以将这249500中情况按二进制编码,然后找来18条警犬,去喝对应的二进制编码为1的液体(注意到,这里每次都是喝两瓶,而不是一瓶,因为每一种情况对应的是100瓶里面的任意两瓶),这样我们就可以得到那两瓶是毒药了。
3、1-1000头猪排成一排,每一轮都枪毙奇数号的猪,依次循环只到最后只剩下一头猪,问这头猪第一轮的编号是多少?
解法:以二进制来考虑这个问题,1-1000号猪,依次以1、0报数,报1的都杀掉,报0的在这一轮中可以活下来。如果一头猪要想活的久一点,那么它应该尽量使自己多报0。因此撑到最后一轮的猪,之前的报数一定都是0,现在考虑1000头猪需要杀几轮才剩下最后一头猪。显然每次都是杀掉一半的猪,1000->500->250->125->64->32->16->8->4->2->1,一共需要十轮。所以最后一头猪应该在第十轮报1,前面的9轮都报0,这样幸存猪的二进制编号为:1000000000(十进制:512),所以第一轮位于512号的猪可以幸存到最后一轮。