3只老鼠确定8个瓶子(只有一个瓶子中药水有毒)哪瓶药水有毒。

其实将8个瓶子用二进制表示,将每个bit位上为1的混合之后,这样就有三份药水,分别给3只老师吃。

0=0 0 0
1=0 0 1
2=0 1 0
3=0 1 1
4=1 0 0
5=1 0 1
6=1 1 0
7=1 1 1

其中二进制位为1的地方表示哪只老鼠吃哪瓶药。即:

老鼠1喝4,5,6,7号的药;

老鼠2喝2,3,6,7号的药;

老鼠3喝1,3,5,7号的药

最后观察老鼠的情况,0表示没死,1表示死了。

如果老鼠1和老鼠3死了,则对应的位标为101,即对应的十进制是5,这样就可以确定5号瓶的药水有毒。

import java.util.Scanner;

public class Solution{
    public static void main(String[] args){
          Scanner s=new Scanner(System.in);
          String str=s.nextLine();
          String[] strArr=str.split(" ");
         //随机输入0和1,但是1只能出现一次,并且总共为8个数
          int[] bottle=new int[8];
          for(int i=0;i<strArr.length;i++){
              bottle[i]=Integer.parseInt(strArr[i]);
          }   
          //试验,并获取相应的结果       
          int[] r=getResult(bottle);
          //将二进制标号的瓶子转换为十进制
          int num=0;
          for(int i:r){
              num=num*2+i;
          }
          s.close;
          System.out.println(num);
    }

    public static int[] getResult(int[] bottle){
          int[] result=new int[3];
          //老鼠1喝4,5,6,7号的药
          result[0]=bottle[4]|bottle[5]|bottle[6]|bottle[7];
          //老鼠2喝2,3,6,7号的药
          result[1]=bottle[2]|bottle[3]|bottle[6]|bottle[7];
          //老鼠3喝1,3,5,7号的药
          result[2]=bottle[1]|bottle[3]|bottle[5]|bottle[7];
          return result;
    }
}

另外,扩展到1000个瓶子,其中999瓶子中的药水是无毒的,剩余的1瓶是有毒的。其实也是类似的原理,转换为二进制。

 

 posted on 2018-06-26 17:22  会飞的金鱼  阅读(421)  评论(0)    收藏  举报