在120枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,最坏情况下,能不能只比较5次就检测出这枚假币?

本文主要是介绍在120枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,最坏情况下,能不能只比较5次就检测出这枚假币?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题目我想先通过另外一道题目引入我的方法:

13枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,最坏情况下,能不能只比较3次就检测出这枚假币?

将13枚硬币分为三组

ABCD  EFGH  IJKLM

这里引入一个概念,每次天平倾斜方向称之为X方向、Y方向、和平衡

X方向不一定就是向左倾斜,只不过和Y方向是相对的。我们可以定义任意一种倾斜方向为X方向

(注:当文中所说M和N进行比较时,默认前一个放X位,后一个放在Y位,即M在X位,N在Y位)

将ABCD和EFGH进行比较:

得到三种情况:L位倾斜、R位倾斜和平衡

假设平衡,则比较IA和JK,如果还是平衡则比较L和A可以得到是L还是M的问题,如果不平衡则记录倾斜方向,假设为X方向倾斜,最后比较J和K,如果第三次和第二次一样位X方向倾斜,则假币没有变换方向为K反之为J,平衡则为I

但是最坏情况下应该是第一次使用天平就发生倾斜,假设为X位倾斜则第二次比较ABE和CDF,如果平衡则在GH中,略。如果不平衡,则要则要看第二次使用天平是否和第一次一样是X方向倾斜,如果还是X方向倾斜则假币没有变换方向,假币在ABF中,反之在CDE中,假设第一次第二次都是X方向倾斜,则假币没有变换方向那么假币一定在ABE中,如果变换方向为Y方向倾斜则假币在过程中调换方向假币在CDE中。

假设假币在ABF中,那么第三次我们比较A和B,还是X方向倾斜则假币三次都没有变换方向所以假币为A,反之假币为B,平衡则为F,同理。

通过这道题,我思考了一个概念,N次使用天平最多能找到多少个硬币中的假币呢?

每一次进行比较我们都有三中状态,X方向倾斜、Y方向倾斜、和平衡

那上题中3次使用天平我们就可以得到 3^{3} =27种不同的结果,这时我想到XYX和YXY方向倾斜其实本质上是一样的,因为我们由于假币重量是重还是轻是未知的,所以只能判断第一次使用天平和第二次方向是相同还是相反的,所以这个结果需要除以2,但是有一种情况例外:即三次都为平衡状态,所以我们要先在总的情况下-1

所以,我们最终会得到 (3^{3}-1)/2 = 13 种情况,也就是说最终我们会获得13种不同的情况,也就是在13个硬币下使用三次天平找到假币。

同理5次使用天平最多在(3^{5}-1)/2 = 121种情况,也就是最多在121枚硬币中使用五次天平找到假币

推广到N次,则N次最多在(3^{N}-1)/2 个硬币中找到假币

对于本题具体的实践过程比较复杂,将三维推广到五维更加难写,欢迎大家能够整理出具体过程并在评论区附上链接。


2022.10.18于山东工商学院西校区5257

这篇关于在120枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,最坏情况下,能不能只比较5次就检测出这枚假币?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/801235

相关文章

mybatis-plus如何根据任意字段saveOrUpdateBatch

《mybatis-plus如何根据任意字段saveOrUpdateBatch》MyBatisPlussaveOrUpdateBatch默认按主键判断操作类型,若需按其他唯一字段(如agentId、pe... 目录使用场景方法源码方法改造首先在service层定义接口service层接口实现总结使用场景my

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Python如何实现高效的文件/目录比较

《Python如何实现高效的文件/目录比较》在系统维护、数据同步或版本控制场景中,我们经常需要比较两个目录的差异,本文将分享一下如何用Python实现高效的文件/目录比较,并灵活处理排除规则,希望对大... 目录案例一:基础目录比较与排除实现案例二:高性能大文件比较案例三:跨平台路径处理案例四:可视化差异报

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee