12个乒乓球,有一个次品,不知轻重,用一台无砝码天平称三次,找出次品,告知轻重?

news2024/11/27 8:31:45

前言

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-7
        int 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,9
            int num21=weights[0]+weights[1];
            int num22=weights[8]+weights[9];
            if(num21==num22){
                //第二次平衡,次品在10-11里面,第三次称重正品组拿一个,比如0次品组拿一个比如10
                int num31=weights[0];
                int num32=weights[10];
                if(num31==num32){
                    //第三次平衡,次品为11
                    return 11;
                }else{
                    //第三次不平衡,次品为10
                    return 10;
                }
            }else{
                //第二次不平衡,次品在8-9里面,第三次称重正品组拿一个,比如0次品组拿一个比如8
                int num31=weights[0];
                int num32=weights[8];
                if(num31==num32){
                    //第三次平衡,次品为9
                    return 9;
                }else{
                    //第三次不平衡,次品为8
                    return 8;
                }
            }

        }else{
            //第一次不平衡,次品在0-7里面,第二次称重则拿0,1,4和3,7,8
            int num21=weights[0]+weights[1]+weights[4];
            int num22=weights[3]+weights[7]+weights[8];
            if(num21==num22){
                //第二次平衡,次品在2和5,6里面,第三次称重5,6
                int 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,1
                    int 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,3
                    int 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,3
                    int num31=weights[0];
                    int num32=weights[3];
                    if(num31==num32){
                        //第三次平衡,则4是次品
                        return 4;
                    }else {
                        //第三次不平衡,则3是次品
                        return 3;
                    }
                }else{
                    //第一次0-3重,次品在0,1和7里面,第三次称重0,1
                    int 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-7
        int 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,9
            int num21=weights[0]+weights[1];
            int num22=weights[8]+weights[9];
            if(num21==num22){
                //第二次平衡,次品在10-11里面,第三次称重正品组拿一个,比如0次品组拿一个比如10
                int num31=weights[0];
                int num32=weights[10];
                if(num31==num32){
                    //第三次平衡,次品为11
                    return 11;
                }else{
                    //第三次不平衡,次品为10
                    return 10;
                }
            }else{
                //第二次不平衡,次品在8-9里面,第三次称重正品组拿一个,比如0次品组拿一个比如8
                int num31=weights[0];
                int num32=weights[8];
                if(num31==num32){
                    //第三次平衡,次品为9
                    return 9;
                }else{
                    //第三次不平衡,次品为8
                    return 8;
                }
            }

        }else{
            //第一次不平衡,次品在0-7里面,第二次称重则拿0,1,4和2,3,8
            int num21=weights[0]+weights[1]+weights[4];
            int num22=weights[2]+weights[3]+weights[8];
            if(num21==num22){
                //第二次平衡,次品在5,6,7里面,第三次称重5,6
                int 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,8
                    int num31=weights[0];
                    int num32=weights[8];
                    if(num31==num32){
                        //第三次平衡,则1是次品
                        return 1;
                    }else {
                        //第三次不平衡,则0是次品
                        return 0;
                    }
                }else{
                    //第一次0-3重,次品在2,3,4里面,第三次称重2,3
                    int 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,3
                    int 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,8
                    int num31=weights[0];
                    int num32=weights[8];
                    if(num31==num32){
                        //第三次平衡,则1是次品
                        return 1;
                    }else {
                        //第三次不平衡,则0是次品
                        return 0;
                    }
                }
            }

        }
    }
}

总结

算法题考察的是大家的逻辑思维能力,看来自己还是太菜了。学习不思则罔,思而不学则殆。学无止境,要不断学习进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1671166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学老师们

小学三年级之前的数学老师&#xff0c;包括学前班给过我零分的数学老师&#xff0c;模样、姓名都不记得了。能回忆起来的最早的数学老师是四、五年级的李成娥老师。 李老师四十岁左右&#xff0c;短发&#xff0c;温和、爱笑&#xff0c;尤其是在班主任张老师的衬托下&#xf…

等保测评技术方案(五)

&#xff08;八&#xff09;漏洞扫描方案 1.参与人员 乙方工程师&#xff1a;谭 然、张 剑等。 范围经过双方确认&#xff0c;此次评估的对象包括&#xff1a; 2.网络设备 IP 地址 设备型号 备注 / / / / / / 以现场测评实际数据为准 3.应用系统 地址 …

全球静态IP购买:全面指南与实用建议

在数字化时代&#xff0c;互联网连接已成为企业和个人日常运营和生活的核心。而全球静态IP地址&#xff0c;作为网络身份的独特标识&#xff0c;其重要性不言而喻。静态IP地址提供了稳定的网络连接和更高级的网络管理功能&#xff0c;使得远程访问、服务器托管、网络安全等应用…

MPAndroidChart 详细使用 - BarChart

chart下面的方法 getDescription().setEnabled(boolean enabled);//设置描述是否显示 setPinchZoom(boolean enabled);//设置x轴和y轴能否同时缩放。默认是否 setScaleEnabled(boolean enabled);//是否支持缩放 setScaleXEnabled(boolean enabled);//启用/禁用x轴上的缩放 setS…

Stable Diffusion WebUI 绘画

配置环境介绍​ 目前平台集成了 Stable Diffusion WebUI 的官方镜像&#xff0c;该镜像中整合如下资源&#xff1a; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本&#xff1a;v1.7.0 Python版本&#xff1a;3.1…

C# 中的 JPG 二维码阅读器 - 在线条码扫描仪

让我们为业务应用程序开发一个JPG QR 码读取器模块&#xff0c;以自动执行 QR 码检测和读取。这种自动化将为您的应用程序带来生产力方面的竞争优势。此外&#xff0c;这篇博文将介绍一种基于网络的在线条码扫描仪&#xff0c;用于在线扫描条码。Aspose.BarCode提供多种编程语言…

JAVA智慧工地管理系统源码,智慧工地扬如何实现对工地扬尘的实时监测

智慧工地扬尘监测系统概述 智慧工地扬尘监测系统是一种利用现代信息技术&#xff0c;如光电传感技术和无线传输技术&#xff0c;对工地扬尘污染进行实时监测和管理的高效工具。该系统的目的是为了保护环境&#xff0c;减少因建筑施工产生的扬尘对周边地区的影响&#xff0c;同…

探索国外静态IP:跨境网络的基石

在数字化时代&#xff0c;互联网已经成为我们生活和工作的重要部分。无论是远程办公、在线教育还是跨境电商&#xff0c;稳定的网络连接都至关重要。而在这个过程中&#xff0c;国外静态IP以其独特的优势&#xff0c;成为了许多企业和个人用户的选择。 一、国外静态IP的应用场景…

【spring】application.yml导入额外配置文件

有时候application.yml 已经配置很多配置已经很大很乱了想把他们拆出去放在一个独立的XX.yml文件管理。这时候就用到了 spring.config.import 属性。 spring.config.import spring.config.import 是 Spring Boot 2.4 版本引入的一个配置属性&#xff0c;用于导入额外的配置数…

(动画详解)LeetCode232.用栈实现队列

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…

GitHub 星标高达9k star,这款高颜值的JSON可视化工具,我滴个妈呀,太惊艳了

闲言碎语太多了 所以做好自己就好啦 你把我丢下 然后告诉我好好生活 你明知道我的快乐只与你有关 你却告诉我 我自由了 一切都会变好的 比如从穷变成好穷 ​ 众所周知。json已经是程序员最常打交道的一种数据组织的方式。无论是前端还是后端&#xff0c;都有许多关于json的…

ohmyzsh的安装过程中失败拒绝连接问题的解决

1.打开官网Oh My Zsh - a delightful & open source framework for Zsh 在官网能看到下面的界面 有这两种自动安装的方式 个人本次选择的是: wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O - 1.打开终端输入安装的指令 sh -c "$(wget…

【论文阅读】Machine Learning, Linear Algebra, and More: Is SQL All You Need?

文章目录 摘要一、介绍二、SQL算法原语2.1、Variables2.2、Functions2.3、Conditions2.4、Loops2.5、Errors 三、案例研究3.1、对数据库友好的SQL映射3.2、性能结果 四、结论以及未来工作 摘要 尽管SQL在简单的分析查询中无处不在&#xff0c;但它很少用于更复杂的计算&#xf…

实习大学生如何在Purple Pi OH鸿蒙开发板下调试Android串口?

本文适用于Purple Pi OH在Android固件后串口的开发与使用。触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大降低了开源鸿蒙开发者的入门门槛&#xff0c…

如何利用甘特图来提高资源的是使用效率?

在项目管理中&#xff0c;甘特图是一种常用的工具&#xff0c;用于规划和跟踪项目进度。它通过条形图的形式展示项目的时间表和任务依赖关系&#xff0c;帮助项目经理和团队成员清晰地了解项目的时间线和进度。通过合理利用甘特图&#xff0c;可以显著提高资源的使用效率&#…

【话题】软件开发的航海图:程序员的实用神器探秘

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景一、代码编写二、版本控制三、测试与调试四、部署与运维五、总结文章推荐 背景 在软件开发的广阔海洋中&#xff0c;每一位程序员都是一位勇敢的航海家&#xff0c…

安卓手机数据恢复全攻略:从备份到专业软件一网打尽!

随着科技的飞速发展&#xff0c;我们的生活中越来越离不开手机。然而&#xff0c;在使用手机的过程中&#xff0c;我们可能会遇到数据丢失的问题。对于安卓手机用户来说&#xff0c;如何有效地恢复丢失的数据是一个值得探讨的问题。本文将为您介绍安卓手机数据恢复的全攻略&…

[笔试强训day08]

文章目录 HJ108 求最小公倍数NC95 数组中的最长连续子序列DP39 字母收集 HJ108 求最小公倍数 HJ108 求最小公倍数 #include<iostream>using namespace std;int a,b;int gcd(int a,int b) {if(b0) return a;return gcd(b,a%b); } int main() {cin>>a>>b;int …

NoSql数据存储:Redis

NoSql 数据存储&#xff1a;Redis 前言安装在Windows上安装Redis在Linux上源代码安装Redis远程连接 基本操作常用命令stringhashlistsetzset SpringBoot整合Redis基本使用项目案例排行榜应用&#xff0c;取浏览量最高TOP N数据的操作需要精确设定过期时间的应用计数器应用Uniq操…

一站式健康管理平台,让健康触手可及

如何有效地管理慢性病&#xff0c;提高患者的健康水平&#xff0c;成为国家和社会关注的焦点。慢病健康管理系统应运而生&#xff0c;以其一站式健康管理平台的特性&#xff0c;让健康触手可及。 一、打破壁垒&#xff0c;以医疗标准做健康管理 慢病健康管理系统不仅打破了医疗…