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
浙公网安备 33010602011771号