CCF CSP认证 历年题目自练Day51

news2024/11/18 20:00:57

此题又丑又长可以直接从题目分析(个人理解)部分看

题目

试题编号: 201812-3
试题名称: CIDR合并
时间限制: 1.0s
内存限制: 512.0MB
请添加图片描述
请添加图片描述
请添加图片描述
样例输入
2
1
2
样例输出
1.0.0.0/8
2.0.0.0/8
样例输入
2
10/9
10.128/9
样例输出
10.0.0.0/8
样例输入
2
0/1
128/1
样例输出
0.0.0.0/0
请添加图片描述
请添加图片描述

题目分析(个人理解)

  1. 先读题,真的恶心啊,题目那么长谁都不想读,其实这种题应该先从题目描述部分开始读;而不是题目背景;我这个傻子题目背景看了半天(至少1小时)当看到样例输入的时候那个打点的加粗的,表示都是标准输入;也就是你如果先看题目背景那一坨根本没啥用;应该先看题目描述,这样心态会好一些,其实真正要做什么题目描述给的很清楚;就是输入一堆ip地址称之为前缀列表,我们要做的就是找到与之等价的包含IP前缀数目最小的前缀列表
  2. 关于IP前缀,我们需要处理的有三种情况第一种是标准型,第二种是省略后缀型,第三种是省略长度型。只需要分步求解即可。因此我们做题的流程应该是读完题目描述,分析出来究竟要做什么,然后再根据这些小任务点去到题目背景找自己理解不了的地方。(不找也行)
  3. 第一步,我称之为标准化排序。将省略后缀型和省略长度型全部转化为标准型。那么到底怎么样转化就要去题目背景里面找相应的对应关系。主要是题目背景中IP地址及其表示部分和IP前缀与前缀列表部分。其实如果大家学过计算机网络就很好理解。如果没学过那就仔细读题,一定要理解题意
  4. 到底如何做其实可以直接看题目提示去做,将所有IP前置进行排序以及IP地址为第一关键字,以前缀长度为第二关键字从小到大排序形成一个列表。根据这个提示直接选择列表存储。之后用点进行切分,使用split方法实现。对于标准化我分为三个步骤实现,第一步切分之后放到新的列表里。第二步补零。第三步补len。以此实现将ip地址全部转化为标准型
  5. 第二步,从小到大合并。其实就是关键的步骤是判断前者和后者是不是子集的关系。怎样判断前者是不是后者子集是个关键,这里我们需要先读屏幕背景当中的IP地址和IP前缀的匹配关系部分。判断谁是谁的子集的关系的对象是ip前缀匹配集(牵扯到一点离散数学集合论的知识)我们可以先找到匹配集的最大值,利用int类型直接进行大小判断谁是谁的子集的问题。再看提示中的第二步,从小到大合并。那么我只需要便利这个标准化之后的列表。如果前者是后者的子集,直接删除后者一直做递归即可,此步结束我们可以得到此时的列表没有子集的关系
  6. 第三步,同级合并,第一步先判断,如果a与b的前缀长度相同,则设a‘为一个新的IP前缀,其IP地址与a相同,而前缀长度比a少1。第二步再判断a’是否合法且a的匹配集与b的匹配集的并集等于a’的匹配集,则将a与b从列表中移除,并将a‘插入到列中原来a.b的位置,与上一步不同的是,如果a’之前存在元素,则接下来应当从a’的前一个元素开始考虑,否则继续从a’开始考虑。以此实现同级合并。
  7. 如果还是不明白可以看一下我写的注释。上代码!!!
#先别看这部分,从标准化输入看起
#第二步关于判断子集关系的一个函数
def compare(ipa, ipb):#比较判断是不是子集关系
    for i in range(4):#总共就四个(用.切分后)
        if (ipa[i] < ipb[i]):#后面的比前面大是子集
            return -1#返回-1
        elif (ipa[i] > ipb[i]):#不是子集关系返回1
            return 1
        else:#ip相同的情况
            if (i == 3):
                return 0
#第三步关于同级合并的两个函数
def iszero(a):#判断是不是0
    if ((a[0] * 16777216 + a[1] * 65536 + a[2] * 256 + a[3]) % (2 ** (32 - a[4] + 1)) == 0):
        return 1
    else:
        return 0


def difone(a, b):
    aend = a[5] * 16777216 + a[6] * 65536 + a[7] * 256 + a[8]#a结束
    bbeg = b[0] * 16777216 + b[1] * 65536 + b[2] * 256 + b[3]#b开始
    if (aend + 1 == bbeg):
        return 1
    else:
        return 0

#首先先标准化存储
n = int(input())
cidr = []#存放标准化之后的所有IP前缀#是个二维列表
for i in range(n):
    string = input()
    b = []
    if (len(string.split('/')) == 1):  # 省略长度型
        temp = list(map(int, string.split('.')))#判断长度为几段;temp长度为4则为32;3则为24;依次类推
        k = len(temp)#记录“len”具体数值
        #按照题目定义:例如:/32 /24 /16 /8即为“len”
        for j in range(k):#把省略时的字符串先存入
            b.append(temp[j])
        for j in range(4 - k):#标准化第一步(补零)
            b.append(0)
        b.append(k * 8)#标准化第二步(补“len”)
    else:  # 省略后缀型与标准型
        t = string.split('/')
        te = int(t[1])#记录“len”
        tem = list(map(int, t[0].split('.')))#省略时的字符串存放;利用map函数映射成int类型;为用数值直接排序做准备;
        tem.append(te)
        temp = tem
        k = len(temp)
        last = temp[-1]
#关于省略后缀型只有如下情况:/32 /24 /16 /8按数值补零
        for j in range(k - 1):#先记录省略时的字符
            b.append(temp[j])
        for j in range(4 - k + 1):#补零
            b.append(0)
        b.append(temp[k - 1])
    cidr.append(b)
#第一步排序
cidr.sort(key=lambda x: (x[0], x[1], x[2], x[3], x[4]))
#第二步:从小到大合并
for x in cidr:#遍历每一个IP前缀(从头到尾扫描)
    adder = 2 ** (32 - x[4]) - 1#因为为满足ip的低(32-len)二进制为0;为了确定最大匹配集的值,又因为最大不超过255所以减1;
    #注意题目背景中的关于IP地址和IP前缀匹配的描述,以下代码都是为了根据len确定匹配集
    a = adder % 256#逐个确定增加量
    b = (adder // 256) % 256
    c = (adder // 65536) % 256
    d = (adder // 16777216) % 256
    x.append(d + x[0])#逐个确定匹配集最大IP地址;并添加在列表x;方便后续合并子集做准备
    x.append(c + x[1])
    x.append(b + x[2])
    x.append(a + x[3])
cidr1 = []#存放合并之后的CIDR;不会存在谁是谁的子集的情况#实现方法看下面的代码
while len(cidr) > 1:#标准化后合法的(其实都是合法的):
    if (compare(cidr[0][5:], cidr[1][5:]) < 0):#判断前者是不是后者子集关系;如果是
        cidr1.append(cidr[0])#把范围大的追加
        cidr.pop(0)#删除范围小的前者
    else:#如果前者不是后者子集
        cidr.pop(1)#还是一样把范围小的删掉
cidr1.append(cidr[0])#写入cidr1
#第三步同级合并
cidr2 = []
while len(cidr1) > 1:#如果长度合法即存在ip;也就是扫描列表
    if (iszero(cidr1[0]) == 0):#判断len
        cidr2.append(cidr1[0])
        cidr1.pop(0)
    elif (cidr1[0][4] != cidr1[1][4]):#a与b的前缀长度不同的时候
        cidr2.append(cidr1[0])
        cidr1.pop(0)
    elif (difone(cidr1[0], cidr1[1]) == 0):
        cidr2.append(cidr1[0])
        cidr1.pop(0)
    else:#a与b的前缀长度相同
        cidr1[0][4] -= 1#前缀长度少1
        cidr1[0][5:] = cidr1[1][5:]#ip地址与a相同
        cidr1.pop(1)#该删删
cidr2.append(cidr1[0])#该加加

for x in cidr2:#按要求输出即可
    print('.'.join(map(str, x[0:4])), end='')
    print('/', end='')
    print(x[4])

总结

泰迪杯数据分析技能赛成绩出来了,下一期写泰迪杯的。

请添加图片描述
请添加图片描述

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

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

相关文章

2022年9月26日 Go生态洞察:Go运行时4年后的进展

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

不瞒各位,不安装软件也能操作Xmind文档

大家好&#xff0c;我是小悟 作为搞技术的一个人群&#xff0c;时不时就要接收产品经理发过来的思维脑图&#xff0c;而此类文档往往是以Xmind编写的&#xff0c;如果你的电脑里面没有安装Xmind的话&#xff0c;不好意思&#xff0c;是打不开这类后缀结尾的文档。 打不开的话…

Web漏洞分析-SQL注入XXE注入(中上)

随着互联网的不断普及和Web应用的广泛应用&#xff0c;网络安全问题愈发引起广泛关注。在网络安全领域中&#xff0c;SQL注入和XXE注入是两个备受关注的话题&#xff0c;也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞&#xff0c;带您探寻背后的原…

隐写2-MISC-bugku-解题步骤

——CTF解题专栏—— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 题目信息&#xff1a; 题目&#xff1a;隐写2 作者&#xff1a;harry 提示&#xff1a;f1g{xxx} 解题附件&#xff1a; 解题思路…

蓝桥杯物联网竞赛_STM32L071_9_按键矩阵扩展模块

原理图&#xff1a; 矩阵按键原理图&#xff1a; 实验板接口原理图&#xff1a; 得到对应图&#xff1a; 扫描按键原理&#xff1a; 按键的COLUMN1、2、3分别制0&#xff0c;每次只允许其中一个为0其他都是1&#xff08;POW1和POW2正常状况为上拉&#xff09;&#xff0c;当有…

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

为了让亲戚也能用上chatgpt,我决定建一个代理站点

&#xff08;本文试着用gpt优化了一下&#xff0c;效果有&#xff0c;但是不多&#xff09; ChatGPT在编程中的应用 当ChatGPT刚出来的时候&#xff0c;我尝试了几次&#xff0c;感觉它就像是一个高级版的搜索引擎。但在过去的一个月里&#xff0c;我在公司经常使用GPT来查询…

ruby安装(vscode、rubymine)

https://rubyinstaller.org/downloads/ 下载exe安装即可 会弹出 输入3 安装成功 vscode插件市场安装ruby插件 新建一个目录&#xff0c;打开terminal bundle init //进行初始化&#xff08;如果执行不了&#xff0c;应该是环境变量没生效&#xff0c;重启vscode&#…

Pillow操控图像,Python必备神器全面解析!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Pillow 是一个强大的 Python 图像处理库&#xff0c;它提供了丰富的功能&#xff0c;能够处理图像的加载、编辑、处理和保存。这个库建立在 Python Imaging Library (PIL) 的基础上&#xff0c;并延续了 PIL 的开…

芯擎科技与芯华章深度合作,软硬件协同开发加速车规级芯片创新

12月4日&#xff0c;系统级验证EDA解决方案提供商芯华章&#xff0c;与国产高端车规芯片设计公司芯擎科技正式建立战略合作。双方强强联手&#xff0c;芯擎科技导入芯华章相关EDA验证工具&#xff0c;赋能车规级芯片和应用软件的协同开发&#xff0c;助力大规模缩短产品上市周期…

预测胶质瘤预后的铜结合蛋白的转录组学特征

今天给同学们分享一篇生信文章“Transcriptomic Characterization of Copper-Binding Proteins for Predicting Prognosis in Glioma”&#xff0c;这篇文章发表在Brain Sci期刊上&#xff0c;影响因子为3.3。 结果解读&#xff1a; 铜结合蛋白的转录组表达 共有85种蛋白质被确…

【驾校管理系统源码】基于Springboot+Vue个人驾校预约管理系统

&#x1f345; 简介&#xff1a;500精品计算机源码学习 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 文末获取源码 目录 一、以下学习内容欢迎领取&#xff1a; Eclipse运行教学&#xff1a; Idea运行项目教学&#xff1a; Pycharm调试项目教学&#…

嵌入式rk3399系统问题

1、修改分辨率 修改4k分辨率&#xff1a; 1. 执行命令&#xff1a;cvt 3840 2160 50获得返回结果(2k分辨率为cvt 1920 1080 50)&#xff0c;如图中所示&#xff1a; 2.修改文件&#xff1a;sudo vim /usr/share/X11/xorg.conf.d/20-modesetting.conf将获取到的Modeline如图中所…

二值图像分割统一项目

1. 项目文件介绍 本章为二值图像的分割任务做统一实现&#xff0c;下面是项目的实现目录 项目和文章绑定了&#xff0c;之前没用过&#xff0c;不知道行不行 data 文件夹下负责摆放数据的训练集测试集inference 负责放待推理的图片(支持多张图片预测分割)run_results 是网络训…

业务场景中Hive解析Json常用案例

业务场景中Hive解析Json常用案例 json在线工具 json格式转换在线工具 https://tool.lu/json/format格式互转&#xff1a; // 格式化可以合并整行显示 {"name":"John Doe","age":35,"email":"johnexample.com"}// 格式化…

vm net 方式 静态ip配置访问主机IP和外网

1、win 11 安装vm&#xff0c;镜像文件 F:\software\VMwork\CentOS-7-x86_64-Everything-1804.iso 2、配置网络 net 方式 3、右击网络--》属性---》更改适配器设置--》vmnet8 属性 如果没有vm1、vm8 虚拟机编辑---》虚拟机网络编辑器-->还原默认设置 注意&#xff1a;这…

ONLYOFFICE 协作空间 2.0 现已发布:新增公共房间、插件、重新分配数据、RTL 界面等功能

更新后的 ONLYOFFICE 协作空间新增诸多实用功能&#xff0c;全平台实现多项优化功能。请继续阅读&#xff0c;了解所有更新。 ONLYOFFICE 协作空间是什么 ONLYOFFICE 协作空间是一款开源效率平台&#xff0c;让您与同事、团队成员、客户、合作伙伴、承包商、赞助商和其他第三方…

大学生如何搭建自己的网站

这篇是我在大一的时候&#xff0c;写过的一篇文章。 前言 作为一名大学生&#xff0c;我觉得搭建个人网站很有意义。 这篇博客讲述的是这个寒假&#xff0c;我是如何从零到搭建好个人网站的过程。我提供的主要是具体的思路&#xff0c;也附带了一些零零散散的细节。时间跨度…

GVIM 配置 for begin/end class/endclass 等配对

有时候我们的代码很长&#xff0c;或者结构比较复杂&#xff0c;多个if/else 或者begin/end 快嵌套&#xff0c;为了阅读方便&#xff0c;利用gvim插件实现块跳转还是很有实用性的&#xff0c;下面的.vimrc的配置&#xff0c;简单方便。 使用方式&#xff1a; 将光标定位到块头…

全球与中国汽车电力电子市场:增长趋势、竞争格局与前景展望

目前&#xff0c;世界各国都致力于转向更环保、更永续的传统交通替代方案。 电动车满足所有要求&#xff0c;因为它们具有零废气排放、改善空气品质、减少温室气体排放并创造更清洁、更健康的环境。此外&#xff0c;电动车的运作成本比传统内燃机驱动的汽车低&#xff0c;因为…