Python每日一练:蚂蚁家族(详解集合法)

news2024/10/6 2:20:23

文章目录

  • 前言
  • 一、题目
  • 二、代码分析
  • 总结


前言

这题挺有意思,感觉评简单难度有点低了,如果正经用无向图来做,代码还是有点长的。首先得建立节点,估计除第一个和最后一个每个节点都是一条线连进,一条线连出的。就可以这样设计节点,然后生成树,最后深度搜索。既然都是简单评价了,咱就用个简单的解法。这题和有一道参加宴会介绍人认识的题目很像,都可以用集合来解,而且更容易让人理解。

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

题目描述:
小蚂蚁群是一个庞大的群体,在这个蚂蚁群中有n只小蚂蚁 ,为了保证所有蚂蚁在消息传送的时候都能接收到消息,需要在他们之间建立通信关系。就是要求小蚂蚁都可以通过多只或者直接联系到其他人。 已知几条小蚂蚁之间有通信关系,请问还需要再新建至少多少条关系?

输入描述:
第一行输入整数n,m;n为小蚂蚁总数;m为关系数。(1<=n,m<=1000) 以下m行每行m对整数x,y。(代表x与y有联系)

输出描述:
输出最少需要新建关系数。

二、代码分析

代码如下(示例):

    def solution(self, n, m, vector):
        result = None
        # TODO: 请在此编写代码
        if vector.__len__() == 0:
            return n-1
        relation = [set(vector[0])]   # 用于存放有联系的集合
        rl = 1              # 上面集合的长度,手动写会快些,本身也是可知的
        for x in vector:    # 查找联系,生成集合
            setx = set(x)
            for j in range(rl):
                if ( not relation[j].isdisjoint(setx) ):
                    relation[j] = relation[j].union(setx)
                    break
                elif j== rl-1:
                    relation.append(setx)
                    rl += 1
        part = relation.__len__()-  # 团体间无联系的数量,-1是需要几个新建的联系
        rela_all = set()    # 所有已参加团体的蚂蚁
        for x in relation:
            rela_all = rela_all.union(x)
        rela_all = len(rela_all)
        result = part +  n - rela_all  
        return result

看注释也就明白了,很简单的逻辑:
1、如果关系列表是空的,则需要新建n-1个关系。嗯,偷偷告诉你们,有这样的数据690,0,[ ]。

2、默认第一个关系为一个小团体的初始,设置rl = 1,因为所有新增小团体都是下面代码生成的,是可知的,所以此处写死了团体数量。下面的循环有相应的代码来增加这个值,很明显题目是要求无向图的,咱写集合肯定得考虑效率问题。事实上不用集合,直接用列表查询会超时,别问我咋知道的…

3、稍微有点复杂的就是关系集合生成这一步了,代码中x是每对关系,先变成集合。然后去列表中的小团体集合查询,有就加入,没有就新建一个小团体。其中 isdisjoint 是判断是否交集,这是个否定判断。意思是:“是不是不是交集” 呃~ 这要晕的,换个说法 “是否非交集”。返回 True 表示的是:不是交集。所以笔者在这里加了not,当是交集的时候,就加入。下面的else,要判断是不是最后一个小团体。因为 ralation 列表中可能有很多小团体集合,所以每次要遍历。只有当是最后一个小团体了,上面的代码又没将 x 加入,才新建一个小团体,同时将列表长度 rl 加1。

4、如上,我们就得到了所有的小团体,这里用 part 变量表示。显然,小团体之间需要一个联系就够了,所以这里是小团体数减1。

5、再然后,我们需要知道所有已加入小团体的蚂蚁数。这里用了一个 for 循环。全加入到一个集合中,union 是并集运算。

6、最后小团体之间需要的联系数加上蚂蚁数减去已参加小团体的数就是答案了。


总结

本想再用无向图搜索解一遍的,偷懒了~

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

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

相关文章

对接银行处理退票的解决方案

什么是退票&#xff1f; 在跨行支付时&#xff0c;付款请求提交汇出行后&#xff0c;由汇出行转交至人民银行支付系统&#xff0c;经人民银行大小额系统处理后会先返回交易成功的结果&#xff0c;再由人民银行转至收款行&#xff0c;收款行在清算过程中会将收款人账户信息、状…

MyBatis--XxxxMapper.xml-SQL 映射文件和MyBatis--动态SQL 语句-更复杂的查询业务需求

目录 MyBatis--XxxxMapper.xml-SQL 映射文件 XxxMapper.xml-基本介绍 MyBatis 的真正强大 2、SQL 映射文件 XxxMapper.xml-详细说明 因为这是一个宁外开了一个项目所以做一下前期准备 Monster.java MonsterMapper接口 MonsterMapper .xml MonsterMapperTest.java jdbc…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置[升级1](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【AI大模型】教你用百度《文心一言》5分钟写一篇博客

文章目录 前言文心一言是什么文心一言可以做什么文心一言写博客申请体验写在最后 前言 当今社会&#xff0c;博客已成为了许多人分享观点、知识和经验的重要平台。用文心一言写博客是将自己的思考、想法和经验以文字的形式呈现出来&#xff0c;让更多人了解自己。通过写博客&a…

量化因子在 DolphinDB 中的流式实现攻略

DolphinDB 是一款高性能分布式时序数据库。与传统的关系数据库和常见的时序数据库不同&#xff0c;DolphinDB 不仅提供了高速存取时序数据的基本功能&#xff0c;而且内置了向量化的多范式编程语言与强大的计算引擎。DolphinDB 的计算引擎不仅可以用于量化金融的回测和研发&…

Aztec 征集 Rollup Sequencer去中心化提案

1. 引言 前序博客&#xff1a; Rollup去中心化Rollup Decentralization Aztec Rollup中Sequencer角色的主要职责为&#xff1a; 1&#xff09;从mempool中选取pending交易2&#xff09;将选中的pending交易排序打包到L2区块中3&#xff09;验证所有private交易proof以检查其…

数据结构(C语言):递归算法删除链表中所有值为x的结点

一、一个递归算法的诞生过程 这个标题为什么要叫“一个递归算法的诞生过程”呢&#xff1f;因为我在写这个算法的时候可谓一波三折&#xff0c;冲破重重Bug最终才得到了正确的算法。 所以在这里我和大家分享一下我写这段代码的整个过程。其中提到的一些问题大家可能写代…

网络信息安全攻防学习平台CTF练习-基础篇

网络信息安全攻防学习平台 &#xff1a;http://hackinglab.cn/main.php 1、key在哪里&#xff1f; 进入环境之后&#xff0c;右击查看源代码&#xff0c;看到key再网页备注里面&#xff1a; 2、再加密一次你就得到key啦~ 根据提示信息&#xff0c;在加密一次就能得到key&#…

shell脚本----基础命令sort-tr-uniq-cut-split-paste-eval

文章目录 一、sort命令二、uniq命令三、 tr命令四、cut命令五、split命令六、paste命令七、eval命令 一、sort命令 sort命令以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序&#xff0c;比较的原则是从首字符向后&#xff0c;一次按ASCII码的值进行比…

Mail.Ru邮箱注册教程

Mail.Ru 简介 Mail.Ru来自俄罗斯一家网络公司。该初始建立于1998年作为电子邮件服务&#xff08;因此而得名&#xff09;&#xff0c;并继续成为网络的俄语圈主要参与者&#xff0c;每月活跃用户达到俄罗斯网络用户的86&#xff05;&#xff0c;是俄罗斯最大的两家互联网企业之…

Java框架学习03(Spring中设计模式详解)

1、控制反转(IoC)和依赖注入(DI) IoC(Inversion of Control,控制反转) 是 Spring 中一个非常非常重要的概念&#xff0c;它不是什么技术&#xff0c;而是一种解耦的设计思想。 IoC 的主要目的是借助于“第三方”(Spring 中的 IoC 容器) 实现具有依赖关系的对象之间的解耦(IOC…

802. 找到最终的安全状态

class Solution { public:bool vis[40005];//vis[i]表示从节点i开始的所有可能路径是否可以到达终端节点vector<int>regraph[40005];map<int,int>mp;bool id_num[40005];bool dfs(vector<vector<int>>& graph,int st){if(mp[st] || vis[st])//如果…

内网渗透—域环境之信息收集

内网渗透—域环境之信息收集 1. 前言2. 关于域2.1. 域搭建2.2. 域渗透思路 3. 域信息收集3.1. 判断是否存在域3.1.1. 查询网络信息3.1.2. 查询当前登录域与域环境3.1.3. 判断主域 3.2. 查找域控制器3.2.1. 查询DNS地址3.2.2. 查看域控制器的机器名3.2.3. 查看域控制器 3.3. 获取…

媒体邀约之发布会彩排哪些内容和注意那些细节?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 相信发布会前小伙伴都会进行彩排&#xff0c;对发布会的细节&#xff0c;流程&#xff0c;各个工种如何配合进行提前的演练&#xff0c;那么发布会彩排哪些内容&#xff0c;要注意哪些细节…

Linux shell编程常用命令(sort排序 uniq重复行 set +-x调试脚本 tr压缩替换字符 cut切片 split拆分 paste合并文件列 eval扫描变量)

sort命令 排序 以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序输出。 sort [选项] 参数 cat file | sort 选项-n 按照数字进行排序 -r 反向排序 -u 等同于u…

[学习笔记]python的web开发全家桶(ing)

源学习视频 目的&#xff1a;开发一个平台(网站) 前端开发&#xff1a;HTML、CSS、JavaScriptWeb框架&#xff1a;接收请求并处理MySQL数据库&#xff1a;存储数据地方 快速上手&#xff1a; 基于Flask Web框架让你快速搭建一个网站出来。 深入学习&#xff1a; 基于Django…

Google Chrome谷歌浏览器崩溃,错误代码: STATUS_STACK_BUFFER_OVERRUN

前两天Edge浏览器崩溃&#xff0c;一通测试&#xff0c;最终解决。谷歌一直没更新&#xff0c;今天更新了下&#xff0c;也崩溃了。 错误代码: STATUS_STACK_BUFFER_OVERRUN 解决办法&#xff1a; 1、开始菜单搜索&#xff1a;ExploitProtection&#xff0c;打开进入。 2、切…

前端CSS学习(二)

1、选择器进阶 1.1 后代选择器&#xff1a;空格 作用&#xff1a;根据HTML标签的嵌套关系,选择父元素后代中满足条件的元素 选择器语法&#xff1a;选择器1 选择器2 { css } 结果&#xff1a;在选择器1所找到标签的后代(儿子、孙子、重孙...)中&#xff0c;找到满足选择器2的…

Ubuntu高效工具——autojump、terminator(快捷键失灵问题)

Ubuntu高效工具——autojump、terminator(快捷键失灵问题) Ubuntu高效工具——autojump、、terminator(快捷键失灵问题) 自动快速跳转工具 autojump终端高效工具 erminator 自动快速跳转工具 autojump 安装指令&#xff1a; sudo apt -y install autojump 安装完成后是不会…

【游戏分析】《某某明月刀》之御风神行

御风神行是《某某明月刀》里很常用的一个技能&#xff0c;可以用来在各大地图的传送点之间相互传送而不需要经过车夫&#xff0c;虽然冷却时间很长&#xff0c;但是非常实用。但是想去到某个传送点必须要先点亮这个传送点&#xff0c;也就是说要跑到传送点附近才可以。但是通过…