12個乒乓球,有一個次品,不知輕重,用一臺無砝碼天平稱三次,找出次品,告知輕重?

前言

B站上看到個視頻:為什么有人不認可清北的學生大多是智商高的?

然后試了下,發現我真菜

自己的思路(失敗)

三次稱重要獲取到12個乒乓球中那個是次品,我想著將12個小球編號,分為四組,每組三個。

編號可以是:123456789abc,分組為123,456,789,abc

第一次稱重123VS456,結果可能是平衡或者不平衡

平衡時就表示這六個是準的,次品在剩下六個789abc里面

不平衡就表示次品在123456里面。

以不平衡為例

第二次稱重123VS789,789是正品,如果平衡則123也是正品次品在456里面,不平衡則次品在123里面。

這里以不平衡為例,則次品在123里面。

第三次稱重,123里面拿兩個,比如1VS2,平衡則3是次品,不平衡則次品在12里面。結合第一次稱重結果,如果第一次是123輕則輕的是次品

上面以不平衡為例是可以查找到次品的,但是以平衡為例,則查找不到次品

以平衡為例

第二次稱重123VS789,123是正品,如果平衡則789也是正品次品在9,10,11里面,不平衡則次品在789里面。

以平衡為例,則次品在9,10,11里面。

第三次稱重,9,10,11里面拿兩個,比如9VS10,平衡則11是次品,不平衡時因為第一二次都是平衡的不知道次品和正品的重量關系(輕還是重)此時判斷不出來9,10那個是次品。

別人的方法

首先為球編號123456789abc
第一次1234對比5678
(1)若1234與5678不等重,則9abc排除嫌疑。
不妨設1234輕
? ?第二次125與489稱
? ?(1.1)若125輕,則說明12輕或8重,此時稱1與2即可
? ?(1.2)若489輕,則說明5重或4輕,此時稱4與9或5與9即可
? ?(1.3)若等重,則說明3輕或67重,6與7稱即可
(2)若1234與5678等重,則次品在9abc中。易得,略。

public class Test12 {public static void main(String[] args) {int[]weights0=new int[]{0,1,1,1,1,1,1,1,1,1,1,1};int[]weights1=new int[]{1,-1,1,1,1,1,1,1,1,1,1,1};int[]weights2=new int[]{1,1,2,1,1,1,1,1,1,1,1,1};int[]weights3=new int[]{1,1,1,3,1,1,1,1,1,1,1,1};int[]weights4=new int[]{1,1,1,1,4,1,1,1,1,1,1,1};int[]weights5=new int[]{1,1,1,1,1,5,1,1,1,1,1,1};int[]weights6=new int[]{1,1,1,1,1,1,6,1,1,1,1,1};int[]weights7=new int[]{1,1,1,1,1,1,1,7,1,1,1,1};int[]weights8=new int[]{1,1,1,1,1,1,1,1,8,1,1,1};int[]weights9=new int[]{1,1,1,1,1,1,1,1,1,9,1,1};int[]weights10=new int[]{1,1,1,1,1,1,1,1,1,1,10,1};int[]weights11=new int[]{1,1,1,1,1,1,1,1,1,1,1,11};System.out.println("weights0:"+checkWeights(weights0));System.out.println("weights1:"+checkWeights(weights1));System.out.println("weights2:"+checkWeights(weights2));System.out.println("weights3:"+checkWeights(weights3));System.out.println("weights4:"+checkWeights(weights4));System.out.println("weights5:"+checkWeights(weights5));System.out.println("weights6:"+checkWeights(weights6));System.out.println("weights7:"+checkWeights(weights7));System.out.println("weights8:"+checkWeights(weights8));System.out.println("weights9:"+checkWeights(weights9));System.out.println("weights10:"+checkWeights(weights10));System.out.println("weights11:"+checkWeights(weights11));}public static int  checkWeights(int[]weights) {//12個乒乓球重量數組,按數組位置分為0-11//第一次 0-3VS4-7int num11=weights[0]+weights[1]+weights[2]+weights[3];int num12=weights[4]+weights[5]+weights[6]+weights[7];if(num11==num12){//第一次平衡,次品在8-11里面,第二次稱重正品組拿兩個,比如0,1次品組拿兩個比如8,9int num21=weights[0]+weights[1];int num22=weights[8]+weights[9];if(num21==num22){//第二次平衡,次品在10-11里面,第三次稱重正品組拿一個,比如0次品組拿一個比如10int num31=weights[0];int num32=weights[10];if(num31==num32){//第三次平衡,次品為11return 11;}else{//第三次不平衡,次品為10return 10;}}else{//第二次不平衡,次品在8-9里面,第三次稱重正品組拿一個,比如0次品組拿一個比如8int num31=weights[0];int num32=weights[8];if(num31==num32){//第三次平衡,次品為9return 9;}else{//第三次不平衡,次品為8return 8;}}}else{//第一次不平衡,次品在0-7里面,第二次稱重則拿0,1,4和3,7,8int num21=weights[0]+weights[1]+weights[4];int num22=weights[3]+weights[7]+weights[8];if(num21==num22){//第二次平衡,次品在2和5,6里面,第三次稱重5,6int num31=weights[5];int num32=weights[6];//需要和第一次稱重結合分析if(num31==num32){//第三次平衡,則2是次品return 2;}else if(num31<num32){//第三次不平衡,5輕,如果第一次0-3輕,則6是次品否則5是次品if(num11<num12){return 6;}else {return 5;}}else{//第三次不平衡,6輕,如果第一次0-3輕,則5是次品否則6是次品if(num11<num12){return 5;}else {return 6;}}}else if(num21<num22){//第二次不平衡,0,1,4小于3,7,8 需要和第一次稱重結合分析if(num11<num12){//第一次0-3輕,次品在0,1和7里面,第三次稱重0,1int num31=weights[0];int num32=weights[1];if(num31==num32){//第三次平衡,則7是次品return 7;}else {if(num31<num32){//第三次不平衡,0輕,第一次0-3輕,則0是次品return 0;}else{//第三次不平衡,1輕,第一次0-3輕,則1是次品return 1;}}}else{//第一次0-3重,次品在3和4里面,第三次稱重0,3int num31=weights[0];int num32=weights[3];if(num31==num32){//第三次平衡,則4是次品return 4;}else {//第三次不平衡,則3是次品return 3;}}}else{//第二次不平衡,0,1,4大于3,7,8 需要和第一次稱重結合分析if(num11<num12){//第一次0-3輕,次品在3和4里面,第三次稱重0,3int num31=weights[0];int num32=weights[3];if(num31==num32){//第三次平衡,則4是次品return 4;}else {//第三次不平衡,則3是次品return 3;}}else{//第一次0-3重,次品在0,1和7里面,第三次稱重0,1int num31=weights[0];int num32=weights[1];if(num31==num32){//第三次平衡,則7是次品return 7;}else {if(num31<num32){//第三次不平衡,0輕,第一次0-3重,則1是次品return 1;}else{//第三次不平衡,1輕,第一次0-3重,則0是次品return 0;}}}}}}
}

測試結果

weights0:0
weights1:1
weights2:2
weights3:3
weights4:4
weights5:5
weights6:6
weights7:7
weights8:8
weights9:9
weights10:10
weights11:11

AI的答案

步驟1:將12個乒乓球分為三組,每組4個,分別標記為A、B、C。

第一次稱重:取A組和B組進行稱重。

  • 情況A:如果兩邊平衡,那么次品在C組中。
  • 情況B:如果兩邊不平衡,假設A組重,那么次品有兩種可能:
    • 可能1:次品在A組中(且更重)。
    • 可能2:次品在B組中(且更輕)。

步驟2

  • 如果第一次稱重是情況A(A組和B組平衡):
    • 將C組的乒乓球分為兩組,每組2個,分別標記為C1和C2。將C1放在天平的左邊,從A組(或B組,因為它們是正常的)取2個乒乓球放在天平的右邊進行稱重。
      • 情況A1:如果平衡,次品在C2中。
      • 情況A2:如果不平衡,次品在C1中,并且可以直接通過比較確定它是更重還是更輕。
  • 如果第一次稱重是情況B(A組和B組不平衡):
    • 將A組的乒乓球分為兩組,每組2個,分別標記為A1和A2。將B組的乒乓球也分為兩組,第一組1個和剩下的3個,分別標記為B1(1個)和B2(3個)。進行以下稱重:將A1和B1放在天平左邊,A2和1個正常乒乓球(來自C組已知正常的)放在天平右邊。
      • 情況B1:如果平衡,次品在B2中,且更輕。
      • 情況B2:如果不平衡,則有兩種可能性:
        • 可能性B2.1:如果左邊重(即A1和B1重),那么次品有兩種可能:A1中更重的一個,或者B1中更輕的一個(因為假設A組整體更重,所以B1更輕)。
        • 可能性B2.2:如果右邊重(即A2和正常乒乓球重),那么次品在A2中,且更重。

步驟3

  • 如果第二次稱重是情況A1(次品在C2中):取C2中的兩個乒乓球進行稱重,即可確定哪個是次品,并判斷其輕重。
  • 如果第二次稱重是情況B1(次品在B2中):取B2中的兩個乒乓球進行稱重,輕的一個即為次品。
  • 如果第二次稱重是情況B2(次品在A1或B1或A2中):
    • 如果可能性B2.1(A1中更重的一個,或者B1中更輕的一個):取A1中的兩個乒乓球進行稱重,重的一個即為次品;如果A1中兩個乒乓球平衡,則B1為次品且更輕。
    • 如果可能性B2.2(次品在A2中):A2中的兩個乒乓球進行稱重,重的一個即為次品。

通過這種方法,我們可以在三次稱重內準確地找出次品,并確定其輕重。

AI的邏輯基本可以理解,但是略顯混亂。整體上和上面的方法一樣

代碼

public class Test12 {public static void main(String[] args) {int[]weights0=new int[]{0,1,1,1,1,1,1,1,1,1,1,1};int[]weights1=new int[]{1,-1,1,1,1,1,1,1,1,1,1,1};int[]weights2=new int[]{1,1,2,1,1,1,1,1,1,1,1,1};int[]weights3=new int[]{1,1,1,3,1,1,1,1,1,1,1,1};int[]weights4=new int[]{1,1,1,1,4,1,1,1,1,1,1,1};int[]weights5=new int[]{1,1,1,1,1,5,1,1,1,1,1,1};int[]weights6=new int[]{1,1,1,1,1,1,6,1,1,1,1,1};int[]weights7=new int[]{1,1,1,1,1,1,1,7,1,1,1,1};int[]weights8=new int[]{1,1,1,1,1,1,1,1,8,1,1,1};int[]weights9=new int[]{1,1,1,1,1,1,1,1,1,9,1,1};int[]weights10=new int[]{1,1,1,1,1,1,1,1,1,1,10,1};int[]weights11=new int[]{1,1,1,1,1,1,1,1,1,1,1,11};System.out.println("weights0:"+checkWeights(weights0));System.out.println("weights1:"+checkWeights(weights1));System.out.println("weights2:"+checkWeights(weights2));System.out.println("weights3:"+checkWeights(weights3));System.out.println("weights4:"+checkWeights(weights4));System.out.println("weights5:"+checkWeights(weights5));System.out.println("weights6:"+checkWeights(weights6));System.out.println("weights7:"+checkWeights(weights7));System.out.println("weights8:"+checkWeights(weights8));System.out.println("weights9:"+checkWeights(weights9));System.out.println("weights10:"+checkWeights(weights10));System.out.println("weights11:"+checkWeights(weights11));}public static int  checkWeights(int[]weights) {//12個乒乓球重量數組,按數組位置分為0-11//第一次 0-3VS4-7int num11=weights[0]+weights[1]+weights[2]+weights[3];int num12=weights[4]+weights[5]+weights[6]+weights[7];if(num11==num12){//第一次平衡,次品在8-11里面,第二次稱重正品組拿兩個,比如0,1次品組拿兩個比如8,9int num21=weights[0]+weights[1];int num22=weights[8]+weights[9];if(num21==num22){//第二次平衡,次品在10-11里面,第三次稱重正品組拿一個,比如0次品組拿一個比如10int num31=weights[0];int num32=weights[10];if(num31==num32){//第三次平衡,次品為11return 11;}else{//第三次不平衡,次品為10return 10;}}else{//第二次不平衡,次品在8-9里面,第三次稱重正品組拿一個,比如0次品組拿一個比如8int num31=weights[0];int num32=weights[8];if(num31==num32){//第三次平衡,次品為9return 9;}else{//第三次不平衡,次品為8return 8;}}}else{//第一次不平衡,次品在0-7里面,第二次稱重則拿0,1,4和2,3,8int num21=weights[0]+weights[1]+weights[4];int num22=weights[2]+weights[3]+weights[8];if(num21==num22){//第二次平衡,次品在5,6,7里面,第三次稱重5,6int num31=weights[5];int num32=weights[6];//需要和第一次稱重結合分析if(num31==num32){//第三次平衡,則7是次品return 7;}else if(num31<num32){//第三次不平衡,5輕,如果第一次0-3輕,則6是次品否則5是次品if(num11<num12){return 6;}else {return 5;}}else{//第三次不平衡,6輕,如果第一次0-3輕,則5是次品否則6是次品if(num11<num12){return 5;}else {return 6;}}}else if(num21<num22){//第二次不平衡,0,1,4小于2,3,8 需要和第一次稱重結合分析if(num11<num12){//第一次0-3輕,次品在0,1里面,第三次稱重0,8int num31=weights[0];int num32=weights[8];if(num31==num32){//第三次平衡,則1是次品return 1;}else {//第三次不平衡,則0是次品return 0;}}else{//第一次0-3重,次品在2,3,4里面,第三次稱重2,3int num31=weights[2];int num32=weights[3];if(num31==num32){//第三次平衡,則3是次品return 4;}else if(num31>num32){//第三次不平衡,2重,則2是次品return 2;}else{//第三次不平衡,2輕,則3是次品return 3;}}}else{//第二次不平衡,0,1,4大于2,3,8 需要和第一次稱重結合分析if(num11<num12){//第一次0-3輕,次品在2,3,4里面,第三次稱重2,3int num31=weights[2];int num32=weights[3];if(num31==num32){//第三次平衡,則3是次品return 4;}else if(num31>num32){//第三次不平衡,2重,則3是次品return 3;}else{//第三次不平衡,2輕,則2是次品return 2;}}else{//第一次0-3重,次品在0,1里面,第三次稱重0,8int num31=weights[0];int num32=weights[8];if(num31==num32){//第三次平衡,則1是次品return 1;}else {//第三次不平衡,則0是次品return 0;}}}}}
}

總結

算法題考察的是大家的邏輯思維能力,看來自己還是太菜了。學習不思則罔,思而不學則殆。學無止境,要不斷學習進步!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11396.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11396.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11396.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

yo!這里是socket網絡編程相關介紹

目錄 前言 基本概念 源ip&&目的ip 源端口號&&目的端口號 udp&&tcp初識 socket編程 網絡字節序 socket常見接口 socket bind listen accept connect 地址轉換函數 字符串轉in_addr in_addr轉字符串 套接字讀寫函數 recvfrom&&a…

Java入門基礎學習筆記2——JDK的選擇下載安裝

搭建Java的開發環境&#xff1a; Java的產品叫JDK&#xff08;Java Development Kit&#xff1a; Java開發者工具包&#xff09;&#xff0c;必須安裝JDK才能使用Java。 JDK的發展史&#xff1a; LTS&#xff1a;Long-term Support&#xff1a;長期支持版。指的Java會對這些版…

pycharm報錯Process finished with exit code -1073740791 (0xC0000409)

pycharm報錯Process finished with exit code -1073740791 (0xC0000409) 各種垃圾文章&#xff08;包括chatgpt產生的垃圾文章&#xff09;&#xff0c;沒有給出具體的解決辦法。 解決辦法就是把具體報錯信息顯示出來&#xff0c;然后再去查。 勾選 然后再運行就能把錯誤顯示…

MetaRTC-play拉流客戶端代碼分析

渲染使用opengl&#xff0c;音頻播放使用alsa。 當點擊播放按鈕后&#xff0c;以此調用的類如下&#xff0c;開始建立rtc連接&#xff0c;AV解碼&#xff0c;音頻渲染&#xff0c;視頻渲染。 如果想去除QT&#xff0c;改為cmake工程管理&#xff0c;去掉渲染部分即可。 下方是…

VUE+PrintJS打印-邊距設置問題(提供解決方案)

VUE打印我們一般用printJS&#xff0c;雖然它也提供了邊距設置&#xff0c;但不管怎么調&#xff0c;感覺都不對&#xff0c;也換其他組件試過&#xff0c;沒啥區別&#xff0c;并不能解決問題。 今天又發來個需求&#xff0c;要求設置打印頁面的上、下、左、右邊距&#xff0…

Linux---vim編輯器(續寫)

5. vim正常模式命令集 插入模式 按「i」切換進入插入模式「insert mode」&#xff0c; 按“i”進入插入模式后是從光標當前位置開始輸入文件&#xff1b; 按「a」進入插入模式后&#xff0c;是從目前光標所在位置的下一個位置開始輸入文字&#xff1b; 按「o」進入插入模式…

從頭開始學Spring—01Spring介紹和IOC容器思想

目錄 1.Spring介紹 1.1Spring概述 1.2特性 1.3五大功能模塊 2.IOC容器 2.1IOC思想 ①獲取資源的傳統方式 ②反轉控制方式獲取資源 ③DI 2.2IOC容器在Spring中的實現 ①BeanFactory ②ApplicationContext ③ApplicationContext的主要實現類 1.Spring介紹 1.1Sprin…

Linux系統一步一腳印式學習

Linux操作系統具有許多特點和優勢。首先&#xff0c;它是開放源代碼的&#xff0c;也就意味著任何人都可以對源代碼進行查看和修改。其次&#xff0c;可以同時支持多個用戶且可以同時執行多個任務&#xff0c;此外&#xff0c;Linux操作系統也非常穩定和安全。相對于其他操作系…

銀川崗位外包有邦芒 讓崗位空缺不再成為難題

銀川邦芒人力崗位外包服務&#xff0c;專為企業量身定制&#xff0c;涵蓋從崗位人員招聘到勞動關系終止的全方位、無風險外包解決方案。借助我們的崗位外包&#xff0c;企業可以在確保用工穩定的同時&#xff0c;將更多資源聚焦于核心業務的發展與創新。 我們提供全面、高效的外…

安全測試|常見SQL注入攻擊方式、影響及預防

SQL注入 什么是SQL注入&#xff1f; SQL注入是比較常見的網絡攻擊方式之一&#xff0c;主要攻擊對象是數據庫&#xff0c;針對程序員編寫時的疏忽&#xff0c;通過SQL語句&#xff0c;實現無賬號登錄&#xff0c;篡改數據庫。 SQL注入簡單來說就是通過在表單中填寫包含SQL關鍵…

SSD-60S施耐德電機保護器EOCR-SSD

EOCR主要產品有電子式電動機保護繼電器&#xff0c;電子式過電流繼電器&#xff0c;電子式欠電流繼電器&#xff0c;電子式欠電壓繼電器&#xff0c;其它保護裝置&#xff0c;電流互感器。EOCR-SSD 10-60A電機保護器 系列型號: EOCRSSD-05SEOCRssD-30s EOCRSSD-60SEOCRSSD-0…

Linux文件管理(超詳細講解)

Linux文件管理 一、管理文件1.目錄和路徑2.目錄操作命令3.文件操作命令4.文件內容操作命令 一、管理文件 1.目錄和路徑 文件與目錄簡介 文件是Linux操作系統用來存儲信息的基本結構&#xff0c;是一組信息的集合。目錄是一種特殊的文件&#xff0c;用來保存文件及其相關信息。…

開源即時通訊IM框架 MobileIMSDK v6.5 發布

一、更新內容簡介 本次更新為次要版本更新&#xff0c;進行了bug修復和優化升級&#xff08;更新歷史詳見&#xff1a;碼云 Release Notes、Github Release Notes&#xff09;。 MobileIMSDK 可能是市面上唯一同時支持 UDPTCPWebSocket 三種協議的同類開源IM框架。輕量級、高…

8種常見的CMD命令

1.怎么打開CMD窗口 步驟1&#xff1a;winr 步驟2&#xff1a;在彈出的窗口輸入cmd&#xff0c;然后點擊確認&#xff0c;就會出現一個cmd的窗口 2.CMD的8種常見命令 2.1盤符名稱冒號 說明&#xff1a;切換盤的路徑 打開CMD窗口這里默認的是C盤的Users的27823路徑底下&#xf…

基于微信小程序+JAVA Springboot 實現的【網上商城小程序】app+后臺管理系統 (內附設計LW + PPT+ 源碼+ 演示視頻 下載)

項目名稱 項目名稱&#xff1a; 基于微信小程序的網上商城 項目技術棧 該項目采用了以下核心技術棧&#xff1a; 后端框架/庫&#xff1a; Java, SSM框架數據庫&#xff1a; MySQL前端技術&#xff1a; 微信開發者工具&#xff0c;微信小程序框架 項目展示 5.1 管理員服務…

Mat: Unknown HPROF Version

問題&#xff1a;Mat 加載 android studio 導出的 hprof 文件失敗 原因&#xff1a;android hprof 文件不是標準的 java hprof 文件 解決辦法&#xff1a; 使用 android sdk 自帶的命令將 hprof 轉換成標準的 java hprof

瞬息全宇宙——穿越之旅終極教程,手把手教你做出百萬點贊視頻

最近一種叫“瞬息全宇宙”的視頻火了&#xff0c;抖音一期視頻百萬贊&#xff0c;各個博主視頻都在帶瞬息全宇宙這個標簽&#xff0c;于是就有很多朋友催我出教程了&#xff0c;在琢磨了幾天之后&#xff0c;終于整出來了 教程包含了插件的安裝&#xff0c;界面的講解&#xff…

生產制造行業推拉式生產的復合應用

一、案例分析&#xff08;汽配行業&#xff09; 重點&#xff1a; 1. MTO/MTS 與 PUSH/PULL 有關系但是不是充分關系 2. MTO/MTS 是公司經營策略&#xff0c;更多是對市場需求的經營策略&#xff0c;體現在生產時機上的不同&#xff0c;一個是等客戶需求&#xff0c;一個是填…

HTML4(三):表單

文章目錄 表單1. 基本結構2. 常用表單控件2.1 文本輸入框2.2 密碼輸入框2.3 單選框2.4 復選框2.5 隱藏域2.6 提交按鈕2.7 重置按鈕2.8 普通按鈕2.9 文本域2.10 下拉框2.11 示例 3. 禁用表單控件4. lable標簽5. fieldset與legend標簽6. 總結 表單 概念&#xff1a;一種包含交互…

Raft論文閱讀筆記+翻譯:In Search of Understandable Consensus Algorithm

In Search of Understandable Consensus Algorithm 摘要 Raft是一種管理復制日志的共識算法。它產生與&#xff08;多&#xff09;Paxos等效的結果&#xff0c;并且與Paxos一樣高效&#xff0c;但其結構與Paxos不同。這使得Raft比Paxos更易理解&#xff0c;也為構建實際系統提供…