10瓶毒藥其中只有一瓶有毒至少需要幾隻老鼠可以找到有毒的那瓶

来源:https://www.cnblogs.com/taojietaoge/archive/2022/11/30/16938221.html
-Advertisement-
Play Games

10瓶毒藥其中只有一瓶有毒至少需要幾隻老鼠可以找到有毒的那瓶 身似浮雲,心如飛絮,氣若游絲。 用二分查找和二進位位運算的思想都可以把死亡的老鼠降到最低。 其中,二進位位運算就是每一隻老鼠代表一個二進位0或1,0就代表老鼠存活,1代表老鼠死亡;根據數學運算 23 = 8、24 = 16,那麼至少需要四 ...


10瓶毒藥其中只有一瓶有毒至少需要幾隻老鼠可以找到有毒的那瓶

    身似浮雲,心如飛絮,氣若游絲。

  • 用二分查找和二進位位運算的思想都可以把死亡的老鼠降到最低。
  • 其中,二進位位運算就是每一隻老鼠代表一個二進位0或1,0就代表老鼠存活,1代表老鼠死亡;根據數學運算 23 = 8、2 = 16,那麼至少需要四隻老鼠可以找到其中的那瓶毒藥。

/**
* binary : 0001 : 第1瓶藥水
* binary : 0010 : 第2瓶藥水
* binary : 0011 : 第3瓶藥水
* binary : 0100 : 第4瓶藥水
* binary : 0101 : 第5瓶藥水
* binary : 0110 : 第6瓶藥水
* binary : 0111 : 第7瓶藥水
* binary : 1000 : 第8瓶藥水
* binary : 1001 : 第9瓶藥水
* binary : 1010 : 第10瓶藥水
* 藥液混合後的數組1: [1, 3, 5, 7, 9]
* 藥液混合後的數組2: [2, 3, 6, 7, 10]
* 藥液混合後的數組3: [4, 5, 6, 7]
* 藥液混合後的數組4: [8, 9, 10]
*
* 列印結果如上,此時就可以按照二進位邏輯判定哪瓶是毒藥了。
* 此時用四隻老鼠分別去喝四組混合後的藥液,即老鼠1和混合要和後的數組1,老鼠2喝混合數組2,老鼠3喝混合數組3,老鼠4和混合數組4
* 假設第七瓶是毒藥
* 那麼可以觀察到混合藥液後的數組1、數組2、數組3 都混入的毒藥7
* 所以就是第一隻老鼠死亡,第二只老鼠死亡,第三隻老鼠死亡,第四隻存活,之前混合藥液的邏輯就是 1有毒 0無毒
* 所以它們對應的二進位就是:1110,也就是上述的:binary : 0111 : 第7瓶藥水
*
* 假設第六瓶是毒藥就是對應著:0110,也就是第一隻老鼠存活、第二只老鼠死亡、第三隻老鼠死亡、第四隻老鼠存活
*
* 所以,最後可以根據老鼠的死亡和存活狀態 & 結合混合後的藥液數組 判定哪瓶是毒藥
* 同理 1000瓶毒藥至少需要10只老鼠可以找出那瓶有毒
* 2∧10 = 1024
*/
 1 package com.bebird.vote;
 2 
 3 import java.util.ArrayList;
 4 import java.util.Arrays;
 5 import java.util.List;
 6 
 7 public class TestVirus {
 8 
 9     public static void main(String[] args) {
10         // 給十瓶毒藥標序號,用1~10標記,並轉為二進位
11         List<Integer> virusArr = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
12         // 四個藥液混合的數組
13         List<Integer> list1 = new ArrayList<>();
14         List<Integer> list2 = new ArrayList<>();
15         List<Integer> list3 = new ArrayList<>();
16         List<Integer> list4 = new ArrayList<>();
17         for(int i = 0; i < virusArr.size(); i++) {
18             Integer num = virusArr.get(i);
19             // 設置返回至少4位數字:使用5位數字並切掉第一位數字。
20             String binary = Integer.toBinaryString(num + 0b10000).substring(1);
21             System.out.println("binary : " + binary.concat(" : 第").concat(String.valueOf(i + 1)).concat("瓶藥水"));
22             /**
23              * 把二進位數組中,個位數為1的 十位數為1的 和百位數為1的 千位數為一的 分別組成一個數組
24              * 為什麼這樣做,其實就假設二進位中,1位的是有毒,0位是無毒,按這種邏輯把十瓶藥水混合成四平給四隻老鼠喝
25              */
26             // 判斷二進位 個十百千 位數是否為1:
27             // 個位為1
28             boolean flagGe = (Integer.parseInt(binary) >> 0 & 1) == 1;
29             if (flagGe) {
30                 list1.add(i + 1);
31             }
32             // 十位為1
33             boolean flagShi = (Integer.parseInt(binary) >> 1 & 1) == 1;
34             if (flagShi) {
35                 list2.add(i + 1);
36             }
37             // 百威為1
38             boolean flagBai = (Integer.parseInt(binary) >> 2 & 1) == 1;
39             if (flagBai) {
40                 list3.add(i + 1);
41             }
42             // 千位為1
43             if (binary.startsWith("1")) {
44                 list4.add(i + 1);
45             }
46 
47         }
48         System.out.println("藥液混合後的數組1: "+ list1);
49         System.out.println("藥液混合後的數組2: "+ list2);
50         System.out.println("藥液混合後的數組3: "+ list3);
51         System.out.println("藥液混合後的數組4: "+ list4);
52         /**
53          * binary : 0001 : 第1瓶藥水
54          * binary : 0010 : 第2瓶藥水
55          * binary : 0011 : 第3瓶藥水
56          * binary : 0100 : 第4瓶藥水
57          * binary : 0101 : 第5瓶藥水
58          * binary : 0110 : 第6瓶藥水
59          * binary : 0111 : 第7瓶藥水
60          * binary : 1000 : 第8瓶藥水
61          * binary : 1001 : 第9瓶藥水
62          * binary : 1010 : 第10瓶藥水
63          * 藥液混合後的數組1: [1, 3, 5, 7, 9]
64          * 藥液混合後的數組2: [2, 3, 6, 7, 10]
65          * 藥液混合後的數組3: [4, 5, 6, 7]
66          * 藥液混合後的數組4: [8, 9, 10]
67          *
68          * 列印結果如上,此時就可以按照二進位邏輯判定哪瓶是毒藥了。
69          * 此時用四隻老鼠分別去喝四組混合後的藥液,即老鼠1和混合要和後的數組1,老鼠2喝混合數組2,老鼠3喝混合數組3,老鼠4和混合數組4
70          * 假設第七瓶是毒藥
71          * 那麼可以觀察到混合藥液後的數組1、數組2、數組3 都混入的毒藥7
72          * 所以就是第一隻老鼠死亡,第二只老鼠死亡,第三隻老鼠死亡,第四隻存活,之前混合藥液的邏輯就是 1有毒 0無毒
73          * 所以它們對應的二進位就是:1110,也就是上述的:binary : 0111 : 第7瓶藥水
74          *
75          * 假設第六瓶是毒藥就是對應著:0110,也就是第一隻老鼠存活、第二只老鼠死亡、第三隻老鼠死亡、第四隻老鼠存活
76          *
77          * 所以,最後可以根據老鼠的死亡和存活狀態 & 結合混合後的藥液數組 判定哪瓶是毒藥
78          * 同理 1000瓶毒藥至少需要10只老鼠可以找出那瓶有毒
79          * 2∧10 = 1024
80          */
81 
82 
83     }
84 
85 
86 }

 

 

 

 

身似浮雲 心如飛絮 氣若游絲

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.小結 1.不可變對象一旦創建,就不能改變。為防止用戶修改對象,可以定義不可變類。 2.實例變數和靜態變數的作用域是整個類,與變數在何處聲明無關。實例變數和靜態變數可以在類中的任意位置聲明。為保持一致,最好在類的起始位置聲明它們。 3.關鍵字this可用於表明調用對象。關鍵字this也可以用在構造 ...
  • 序言 各位好啊,我是會編程的蝸牛,作為java開發者,我們每天都要和開發工具打交道。我以前一開始入門java開發的時候,就是用的eclipse,雖然感覺有點繁瑣,但好在還能用。後來偶然間發現了IDEA,然後就漸漸被IDEA所吸引了,不過最近在做一些老項目的開發,大概是十幾年的那種技術,我發現用IDE ...
  • 前言 本文是博主從事後端開發以來,對公司、個人項目的經驗總結,包含代碼編寫、功能推薦、第三方庫使用及優雅配置等,希望大家看到都能有所收穫 博主github地址: https://github.com/wayn111 一. 優雅的進行線程池異常處理 在Java開發中,線程池的使用必不可少,使用無返回值 ...
  • 重構項目目錄 celery_task: logs:項目運行時/開發時日誌目錄包 luffapi:項目同名文件夾 apps:項目所有應用的集合文件夾 libs:第三方類庫的保存目錄[第三方組件、模塊] - 包 media:用戶提交的文件目錄文件夾 settings:配置目錄,包含開發時的配置文件和上線 ...
  • 話說在前面,我不是小黑子~ 我是超級大黑子😏 表弟大周末的跑來我家,沒事幹天天騷擾我,搞得我都不能跟小姐姐好好聊天了,於是為了打發表弟,我決定用Python做一個小游戲來消耗一下他的精力,我思來想去,決定把他變成小黑子,於是做了一個坤坤打籃球的游戲,沒想到他還挺愛玩的~ 終於解放了,於是我把游戲寫 ...
  • 使用腳本自動跑實驗(Ubuntu),將實驗結果記錄在文件中,併在實驗結束之後將結果通過郵件發送到郵箱,最後在windows端自動解析成excel表格。 ...
  • 大家好,我是陶朱公Boy。 前言 上一篇文章《關於狀態機的技術選型,最後一個真心好》我跟大家聊了一下關於”狀態機“的話題。從眾多技術選型中我也推薦了一款阿裡開源的狀態機—“cola-statemachine”。 於是就有小伙伴私信我,自己項目也考慮引入這款狀態機,但網上資料實在太少,能不能系統的介紹 ...
  • 一、Kafka存在哪些方面的優勢 1. 多生產者 可以無縫地支持多個生產者,不管客戶端在使用單個主題還是多個主題。 2. 多消費者 支持多個消費者從一個單獨的消息流上讀取數據,而且消費者之間互不影響。 3. 基於磁碟的數據存儲 支持消費者非實時地讀取消息,由於消息被提交到磁碟,根據設置的規則進行保存 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...