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.mzph.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;去掉渲染部分即可。 下方是…

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操作系统也非常稳定和安全。相对于其他操作系…

安全测试|常见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…

开源即时通讯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;也为构建实际系统提供…

近屿OJAC带你解读:什么是大模型幻觉?

忠实性幻觉也可以细分&#xff0c;分为指令不一致&#xff08;输出偏离用户指令&#xff09;、上下文不一致&#xff08;输出与上下文信息不符&#xff09;、逻辑不一致三类&#xff08;推理步骤以及与最终答案之间的不一致&#xff09;。 具体解析 大模型产生幻觉的原因可能…

国内使用 CloudFlare 避坑指南

最近明月收到了不少新手使用 CloudFlare 的求助,发现很多首次使用 CloudFlare 的甚至包括已经在使用 CloudFlare 的站长们对 CloudFlare 的使用有很多的误区,再加上国内简中互联网上有关 CloudFlare 的教程良莠不齐,更是加深了新手使用 CloudFlare 入坑的概率,让一些别有用…

Today At Apple 20240512 学习拍照

文章目录 微距打开模式设置曝光值人像模式设置光模式实况 官网&#xff1a; https://www.apple.com/today/Apple 亚洲第一大商店&#xff1a;Apple 静安零售店现已在上海开幕如下预约课程&#xff1a;下载apple store&#xff08;不是app store&#xff09;&#xff0c;点击课程…