算法分析-寻找假币题

news2024/11/25 10:55:02

一.题目需求

你手里有70枚重量相等的真金硬币,但你知道其中有一枚是假币,比其他金币轻。
你有一个平衡秤,你可以一次在两边放上任意数量的硬币,它会告诉你两边是否重量相同,或者如果不相同,哪边更轻。
问题:请概述一个寻找假币的算法。你需要称量多少次?怎么使得称量次数最少?

二、算法思想

1.算法分析
1.1. 这个问题可以使用分治算法来解决。
1.2. 我们可以将硬币分成三组,如70枚,先分成,前两组包含23枚硬币,第三组含24枚硬币。
1.3. 然后我们使用平衡秤先称量前两组硬币,如果两边重量相同,那么假币就在剩下的第三组中。然后递归上述操作。
1.4. 如果两边重量不同,那么假币就在较轻的那一边。然后递归上述操作,直到最后只有1枚时,即可找到假币。

三、代码展示
1.天枰称量方法
输入两组硬币列表参数,比较两组总数量值,返回左右哪组轻,或相等:

def balance_scale(group1, group2):
    total1 = sum(group1)
    total2 = sum(group2)

    if total1 < total2:
        return "left"
    elif total1 > total2:
        return "right"
    else:
        return "equal"

2.寻找假币方法

1.1. 采用三分法,寻找假币。
1.2. 我们可以将硬币分成三组,如70枚,先分成,前两组包含23枚硬币,第三组含24枚硬币。
1.3. 然后我们使用平衡秤先称量前两组硬币,如果两边重量相同,那么假币就在剩下的第三组中。然后递归上述操作。
1.4. 如果两边重量不同,那么假币就在较轻的那一边。然后递归上述操作,直到最后只有1枚时,即可找到假币。


def find_fake_coin_by_three_partition(coin_list):
    '''
    @方法名称: 三分法,寻找假币方法
    @中文注释: 三分法,寻找假币方法
        我们可以将硬币分成三组,前两组包含23枚硬币,第三组含24枚硬币。
        然后我们使用平衡秤先称量前两组硬币,如果两边重量相同,那么假币就在剩下的第三组中;
        如果两边重量不同,那么假币就在较轻的那一边。依次类推即可找到假币。
    @入参:
        @param coin_list list 硬币列表
    @出参:
        @param count int 称量次数
    @作    者: PandaCode辉
    @weixin公众号: PandaCode辉
    @创建时间: 2023-11-28
    @使用范例: find_fake_coin_by_three_partition([1,1,1,1,0,1,1])
    '''
    print('=====================')
    # 硬币列表最后只剩1枚时,即找到假币,结束
    if len(coin_list) == 1:
        return 1
    # 硬币列表最后只剩2枚时
    elif len(coin_list) == 2:
        print(coin_list)
        # 还剩2枚,再分2组,再称量一次
        print('还剩2枚,再分2组,再称量一次')
        group_size = 1
        group1 = coin_list[:group_size]
        group2 = coin_list[group_size:]
        result = balance_scale(group1, group2)
        return find_fake_coin_by_three_partition(group1 if result == "left" else group2) + 1
    else:
        # 将硬币列表,三等分大小
        group_size = len(coin_list) // 3
        # 前两组,硬币数量保持一致
        group1 = coin_list[:group_size]
        group2 = coin_list[group_size:2 * group_size]
        # 第三组,硬币数量,取最后剩余值
        group3 = coin_list[2 * group_size:]
        print(group1)
        print(group2)
        print(group3)
        # 天枰称量,前两组
        result = balance_scale(group1, group2)
        print(result)
        # 如果前两组重量相同,那么假币就在剩下的第三组中
        if result == "equal":
            return find_fake_coin_by_three_partition(group3) + 1
        else:
            # 如果前两组重量不同,那么假币就在较轻的那一边。
            return find_fake_coin_by_three_partition(group1 if result == "left" else group2) + 1

这个算法的时间复杂度是O(logn)。

时间复杂度分析:

这个算法使用了三分法来寻找假币。在每次递归调用中,硬币列表被分成三等分,然后进行称量。
这个过程会一直重复,直到只剩下一枚硬币为止。
因此,每一次递归调用都会将问题的规模减半,所以时间复杂度是O(logn)。这里的n是硬币列表的长度。

3.实现主函数

if __name__ == "__main__":
    # 假设有70枚真金硬币,1-为真币,其中一枚是假币,0-为假币
    coin_list = [1 for i in range(70)]
    # 随机选择一个索引,随机选择其中一枚设为假币
    random_index = random.randint(0, len(coin_list) - 1)
    # 修改选中的元素,0-为假币
    coin_list[random_index] = 0
    print(coin_list)
    print("需要称{}次,找到假币。".format(find_fake_coin_by_three_partition(coin_list)))

4.运行结果

从运行结果可以看出,只需称量5次,就能找到假币。

==========结束==========

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

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

相关文章

C语言——输入两个正整数 m 和 n。求其最大公约数和最小公倍数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int m, n;int i;int x 1;int y 0;printf("请输入两个正整数m和n&#xff1a;\n");scanf("%d,%d", &m, &n);for (i 1; i < m && i < n; i) {if (m % i 0 …

汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展

可能很多人都不知道&#xff0c;危化品爆炸、城市光化学烟雾污染&#xff08;如英国伦敦烟雾事件&#xff09;、城市灰霾、温室效应、臭氧层空洞等问题背后的元凶都是VOC。VOC(Volatile Organic Compounds)即挥发性有机物&#xff0c;这类物质易挥发&#xff0c;且普遍具有毒性…

【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)

文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…

算法通关村-----数据流的中位数

数据流的中位数 问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFin…

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据 该项目介绍了如何在 PL 中的 HDL 与 FPGA 中的处理器上运行的嵌入式 C 之间传输数据的基本结构。 介绍 鉴于机器学习和人工智能等应用的 FPGA 设计中硬件加速的兴起&#xff0c;现在是剥开几层“云雾”并讨论 HDL 之间来回传…

高校学生宿舍公寓报修维修生活管理系统 微信小程序b2529

本课题要求实现一套基于微信小程序宿舍生活管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;学生、维修员和卫检员&#xff09;四个模块等功能。 使用基于微信小程序宿舍生活管理系统相对传统宿舍生活管理系统信息管理方式具备很多优点&#xff1a;首先可以大幅…

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO&#xff0c;如下死 GPIO 2 在前端的…

【Java Spring】Spring MVC基础

文章目录 1、Spring MVC 简介2、Spring MVC 功能1.1 Spring MVC 连接功能2.2 Spring MVC 获取参数2.2.1 获取变量2.2.2 获取对象2.2.3 RequestParam重命名后端参数2.2.4 RequestBody 接收Json对象2.2.5 PathVariable从URL中获取参数 1、Spring MVC 简介 Spring Web MVC是构建于…

【计算机网络笔记】以太网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

鸿蒙开发学习——应用程序框架

文章目录 UIAbility的生命周期Create状态WindowStageCreateForeground和Background前后台展示控制onWindowStageDestroyDestory 总结 UIAbility的生命周期 感觉这里他讲的不清晰&#xff0c;UIAbility的4个声明周期是Create、Foreground&#xff08;桌面展示&#xff09;、Back…

C#-认识串口通信并使用串口助手

串口通讯(Serial Communication)&#xff0c;是指外设和计算机间&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数据的一种双向通讯方式。 串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;没有规定接口插件电缆以及使用的通信协议&#xff0…

ModbusRTU\TCP消息帧解析(C#实现报文发送与解析)

目录 知识点常用链接一、Modbus1.ModbusRTU消息帧解析2.主站poll、从站slave通讯仿真-modbusRTU1.功能码01读线圈状态2.功能码03读保持寄存器报文解析&#xff08;寄存器存整型&#xff09;报文解析&#xff08;寄存器存float&#xff09; 3.C#模拟主站Poll&#xff08;ModbusR…

P24 C++ 字符串常量

前言 本期我们讨论字符串字面量。 这是一种基于字符串的东西&#xff0c;上一章我们讲过字符串&#xff0c;你一定要去先去看看那一期的内容。 P23 C字符串-CSDN博客 01 什么是字符串字常量呢&#xff1f; 字符串字面量就是在双引号之间的一串字符 在上面的代码中&#xf…

Linux CentOS_7解决无法上网的问题

参考视频&#xff1a;保姆式教学虚拟机联网liunx(centos)_哔哩哔哩_bilibili 配置网络&#xff1a;解决上网问题 第一步&#xff1a;选择网络模式 第二步&#xff1a;配置网卡命令&#xff1a;打开终端执行命令&#xff1a; 1、先切换到根目录下&#xff0c;防止在第执行cd …

计网Lesson4 - 计算机组网模型

文章目录 计算机的连接方式1. 两台计算机的互联2. 多台计算机的互联&#xff08;旧式&#xff09;3. 多台计算机的互联 --- 集线器&#xff08;Hub&#xff09;4. 网桥5. 多台计算机的互联 --- 交换器&#xff08;Switch&#xff09; 计算机的连接方式 1. 两台计算机的互联 网…

什么是路由抖动?该如何控制

路由器在实现不间断的网络通信和连接方面发挥着重要作用&#xff0c;具有所需功能的持续可用的路由器可确保其相关子网的良好性能&#xff0c;由于网络严重依赖路由器的性能&#xff0c;因此确保您的路由器不会遇到任何问题非常重要。路由器遇到的一个严重的网络问题是路由抖动…

如何使用APP UI自动化测试提高测试效率与质量?

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…

第15关 K8s HPA:自动水平伸缩Pod,实现弹性扩展和资源优化

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维&#xff0c;这节课带来k8s的HPA 自动水平伸缩pod&#xff08; 视频后面有彩蛋 : ) &#xff09;。 我们知道&#xff0c;初始Pod的数量是可以设置的&#xff0c;同时业务也分流量高峰和低峰&a…

Java 8 中 ReentrantLock 与 Synchronized 的区别

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

【安装指南】MySQL和Navicat下载、安装及使用详细教程

目录 ⛳️1.【MySQL】安装教程 1.1 获取下载包 1.2 MySQL安装 1.2.1 MySQL工具安装 1.2.2 MySQL环境变量 1.2.3 验证MySQL安装成功 ⛳️2.【Navicat-v15】的安装和无限使用 ⛳️3.【测试Navicat连接MySQL】 ⛳️1.【MySQL】安装教程 1.1 获取下载包 前往官网获取压缩包…