每日一题——Python实现PAT乙级1090 危险品装箱(举一反三+思想解读+逐步优化)4千字好文


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=1038429484026175488&page=0

我的写法

inputs=input().split()
n=int(inputs[0])
m=int(inputs[1])

inhabited_cps={}
for i in range(n):  #  最终生成一个列表,每个元素为一对不相容物品编号字符串构成的列表
    a,b=input().split()
    inhabited_cps[''.join(sorted([a,b]))]=0
    
for i in range(m):
    cargo_list=set(input().split()[1:])
    for inhabited_cp in inhabited_cps:
        if inhabited_cp[:5] in cargo_list and inhabited_cp[5:] in cargo_list:
            print("No")
            break  #  一旦发现清单内有不相容物品,立即开始下一清单
    else:
        print("Yes")

这段代码的主要功能是检查一组货物清单是否包含不相容的物品对。下面是对这段代码的专业点评,包括时间复杂度和空间复杂度的分析。

代码结构和功能

  1. 输入处理:
    • 首先读取两个整数 n 和 m,分别表示不相容物品对的数量和货物清单的数量。
    • 使用字典 inhabited_cps 存储不相容物品对,键为排序后的物品对字符串,值为0(实际未使用)。
  2. 不相容物品对的存储:
    • 通过循环读取 n 对不相容物品,并将每对物品排序后存储在字典中。
  3. 货物清单检查:
  • 对于每个货物清单,读取清单中的物品,并检查是否存在不相容物品对。
  • 如果发现不相容物品对,输出 "No" 并跳出当前清单的检查;否则输出 "Yes"。

时间复杂度分析

  • 不相容物品对的存储:
    • 读取和存储 n 对不相容物品的时间复杂度为 O(n),因为每次读取和存储操作都是常数时间。
  • 货物清单检查:
  • 对于每个货物清单,需要检查 m 次。每次检查的时间复杂度取决于清单中物品的数量和不相容物品对的数量。
  • 假设每个清单平均有 k 个物品,检查每个清单的时间复杂度为 O(k×len(inhabited_cps))。
  • 由于 inhabited_cps 中有 n 对不相容物品,因此每次检查的时间复杂度为 O(k×n)。
  • 总体时间复杂度为 O(m×k×n)。

空间复杂度分析

  • 不相容物品对的存储:
    • 使用字典 inhabited_cps 存储 n 对不相容物品,空间复杂度为 O(n)。
  • 货物清单的存储:
  • 每次读取一个货物清单,使用集合 cargo_list 存储清单中的物品,空间复杂度为 O(k)。
  • 总体空间复杂度为 O(n+m×k)。

优化建议

  • 字典值的优化:
    • 字典 inhabited_cps 中的值为0,实际未使用,可以考虑移除这个值,只存储键。
  • 集合操作的优化:
    • 使用集合操作可以提高不相容物品对的检查效率,但当前代码已经使用了集合,因此这部分已经优化。
  • 提前终止:
  • 在检查每个清单时,一旦发现不相容物品对,立即终止当前清单的检查,这部分代码已经实现。

总结

这段代码的结构清晰,功能明确,但在处理大量数据时可能会有较高的时间复杂度。通过合理的数据结构选择和优化,可以进一步提高代码的效率。


我要更强

优化时间复杂度和空间复杂度的方法通常涉及改进算法和数据结构的选择。以下是一些优化建议,并附上相应的代码和注释。

优化建议

  1. 使用集合交集:
    • 使用集合的交集操作来快速检查不相容物品对。
  2. 预处理不相容物品对:
    • 预处理不相容物品对,将其分为两个集合,一个集合包含第一个物品,另一个集合包含第二个物品。
  3. 减少不必要的字符串操作:
  • 避免在每次检查时进行字符串排序和拼接操作。

优化后的代码

# 读取输入
n, m = map(int, input().split())

# 存储不相容物品对
inhabited_cps = {}
for _ in range(n):
    a, b = input().split()
    if a > b:
        a, b = b, a  # 确保 a <= b
    if a not in inhabited_cps:
        inhabited_cps[a] = set()
    inhabited_cps[a].add(b)

# 检查每个货物清单
for _ in range(m):
    cargo_list = set(input().split()[1:])
    found_conflict = False
    for a in inhabited_cps:
        if a in cargo_list:
            for b in inhabited_cps[a]:
                if b in cargo_list:
                    print("No")
                    found_conflict = True
                    break
        if found_conflict:
            break
    if not found_conflict:
        print("Yes")

代码解释

  1. 输入处理:
    • 使用 map 函数直接将输入转换为整数。
  2. 不相容物品对的存储:
    • 使用字典 inhabited_cps 存储不相容物品对,键为较小的物品编号,值为包含较大物品编号的集合。
  3. 货物清单检查:
  • 对于每个货物清单,使用集合 cargo_list 存储清单中的物品。
  • 通过遍历 inhabited_cps 中的键,检查是否存在不相容物品对。
  • 使用 found_conflict 标志来提前终止检查。

时间复杂度分析

  • 不相容物品对的存储:
    • 读取和存储 n 对不相容物品的时间复杂度为 O(n)。
  • 货物清单检查:
  • 对于每个货物清单,检查的时间复杂度为 O(k+n),其中 k 是清单中物品的数量,n 是不相容物品对的数量。
  • 总体时间复杂度为 O(m×(k+n))。

空间复杂度分析

  • 不相容物品对的存储:
    • 使用字典 inhabited_cps 存储 n 对不相容物品,空间复杂度为 O(n)。
  • 货物清单的存储:
  • 每次读取一个货物清单,使用集合 cargo_list 存储清单中的物品,空间复杂度为 O(k)。
  • 总体空间复杂度为 O(n+m×k)。

通过这些优化,代码在处理大量数据时会更加高效。


哲学和编程思想

这个问题的解决方法涉及多个哲学和编程思想,具体如下:

哲学思想

  1. 实用主义(Pragmatism):
    • 实用主义强调行动、实践和实际效果。在这个问题中,我们关注的是如何有效地解决实际问题,即如何安全地装箱货物,避免不相容物品的组合。
  2. 逻辑主义(Logicism):
    • 逻辑主义认为数学和逻辑是基础,所有知识都可以通过逻辑推理得到。在这个问题中,我们通过逻辑推理来构建不相容物品对的字典,并检查货物清单是否符合逻辑规则。
  3. 系统论(Systems Theory):
  • 系统论强调整体性、相互作用和动态平衡。在这个问题中,我们将不相容物品对和货物清单视为一个整体系统,通过分析系统中的相互作用来解决问题。

编程思想

  1. 抽象(Abstraction):
    • 抽象是指忽略细节,关注本质。在这个问题中,我们将不相容物品对和货物清单抽象为数据结构(字典和集合),以便更好地处理和操作。
  2. 模块化(Modularity):
    • 模块化是指将系统分解为独立的模块,每个模块负责特定的功能。在这个问题中,我们将代码分解为函数 check_cargo_list,使其更易于理解和维护。
  3. 算法优化(Algorithm Optimization):
    • 算法优化是指通过改进算法来提高效率。在这个问题中,我们使用集合来快速检查不相容物品,从而提高算法的效率。
  4. 数据驱动(Data-Driven):
    • 数据驱动是指以数据为中心,通过数据来驱动决策和操作。在这个问题中,我们通过构建和操作数据结构(字典和集合)来解决问题。
  5. 防御性编程(Defensive Programming):
  • 防御性编程是指预见可能的错误和异常情况,并提前进行处理。在这个问题中,我们通过检查不相容物品对来预见潜在的问题,并输出相应的结果。

通过结合这些哲学和编程思想,我们能够设计出一个高效、可靠且易于理解的解决方案。


举一反三

结合这些哲学和编程思想,以及本题目的具体情况,以下是一些技巧,可以帮助你举一反三,更好地解决类似问题:

哲学思想应用技巧

  1. 实用主义:
    • 关注实际效果:在解决问题时,始终关注解决方案的实际效果和可行性,而不是仅仅停留在理论层面。
    • 迭代改进:通过不断测试和调整,逐步改进解决方案,直到达到满意的实际效果。
  2. 逻辑主义:
    • 逻辑推理:在设计解决方案时,使用逻辑推理来确保每一步都是合理和正确的。
    • 清晰定义:明确问题的定义和边界,确保解决方案与问题定义一致。
  3. 系统论:
  • 整体视角:从整体系统的角度考虑问题,分析各个部分之间的相互作用和影响。
  • 动态平衡:在设计解决方案时,考虑系统的动态变化和平衡,确保解决方案能够适应不同的变化。

编程思想应用技巧

  1. 抽象:
    • 数据结构选择:选择合适的数据结构来表示问题中的实体和关系,如使用字典表示不相容物品对。
    • 接口设计:设计简洁明了的接口,隐藏内部实现细节,使代码更易于理解和使用。
  2. 模块化:
    • 功能划分:将复杂问题分解为多个小模块,每个模块负责一个独立的功能。
    • 代码复用:设计可复用的模块,减少重复代码,提高开发效率。
  3. 算法优化:
    • 时间复杂度分析:分析算法的时间复杂度,选择效率更高的算法。
    • 空间复杂度优化:在必要时优化算法的空间复杂度,减少内存占用。
  4. 数据驱动:
    • 数据验证:在处理数据前,进行数据验证,确保数据的正确性和完整性。
    • 数据分析:利用数据分析来发现问题的模式和规律,指导解决方案的设计。
  5. 防御性编程:
  • 异常处理:预见可能的异常情况,并设计相应的异常处理机制。
  • 边界条件:考虑边界条件和极端情况,确保解决方案在这些情况下也能正常工作。

通过应用这些技巧,可以在解决类似问题时更加灵活和高效,同时也能够提高代码的质量和可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LoadBalance 负载均衡

什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB),是⾼并发,⾼可⽤系统必不可少的关键组件. 当服务流量增⼤时,通常会采⽤增加机器的⽅式进⾏扩容,负载均衡就是⽤来在多个机器或者其他资源中,按照⼀定的规则合理分配负载. 负载均衡的⼀些实现 服务多机部署时,开发⼈…

微积分-导数3(微分法则)

常见函数的导数 常量函数的导数 d d x ( c ) 0 \frac{d}{dx}(c) 0 dxd​(c)0 常量函数的图像是一条水平线 y c y c yc&#xff0c;它的斜率为0&#xff0c;所以我们必须有 f ′ ( x ) 0 f(x) 0 f′(x)0。从导数的定义来看&#xff0c;证明也很简单&#xff1a; f ′ …

44 - 50题高级字符串函数 / 正则表达式 / 子句 - 高频 SQL 50 题基础版

目录 1. 相关知识点2.例子2.44 - 修复表中的名字2.45 - 患某种疾病的患者2.46 - 删除重复的电子邮箱2.47 - 第二高的薪水2.48 - 按日期分组销售产品2.49 - 列出指定时间段内所有的下单产品2.50 - 查找拥有有效邮箱的用户 1. 相关知识点 相关函数 函数含义concat()字符串拼接upp…

MT6989(天玑9300)芯片性能参数_MTK联发科5G处理器

MT6989是联发科Dimensity旗舰系列的成员&#xff0c;旨在为旗舰5G智能手机供应商提供最先进的技术和性能。MT6989也是联发科目前最具创新和强大的5G智能手机芯片&#xff0c;具有领先的功耗效率&#xff0c;无与伦比的计算架构&#xff0c;有史以来最快和最稳定的5G调制解调器&…

MySQL之主从同步、分库分表

1、主从同步的原理 MySQL主从复制的核心是二进制日志 二进制日志&#xff08;binlog&#xff09;记录了所有DDL语句和DML语句&#xff0c;但不包括数据查询&#xff08;select、show&#xff09;语句。 1.1、复制分三步 master主库在事务提交时&#xff0c;会把数据变更记录…

九浅一深Jemalloc5.3.0 -- ②浅*size class

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但5.3.0却少之又少。而且5.3.0的架构与之前的版本也有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是极其枯燥的&#xff0c;…

mmap()函数和munmap()函数的例子

代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <string.h> #include <stdio.h> #include <unistd.h>#define FILELENGTH 80 int main(void) {int fd-1;char …

Objective-C使用块枚举的细节

对元素类型的要求 在 Objective-C 中&#xff0c;NSArray 只能存储对象类型&#xff0c;而不能直接存储基本类型&#xff08;例如 int&#xff09;。但是&#xff0c;可以将基本类型封装在 NSNumber 等对象中&#xff0c;然后将这些对象存储在 NSArray 中。这样&#xff0c;en…

爬虫中如何创建Beautiful Soup 类的对象

在使用 lxml 库解析网页数据时&#xff0c;每次都需要编写和测试 XPath 的路径表达式&#xff0c;显得非常 烦琐。为了解决这个问题&#xff0c; Python 还提供了 Beautiful Soup 库提取 HTML 文档或 XML 文档的 节点。 Beautiful Soup 使用起来很便捷&#xff0c;…

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件&#xff0c;让…

使用世界变换的逆转置矩阵对法线进行变换

法向量变换细节记录 最近在做法向量变换的时候&#xff0c;踩了两个坑&#xff0c;记录一下相关的知识点 法向量做变换&#xff0c;最后一位是补0 我们知道&#xff0c;顶点在做变换的时候最后一位是 1.0&#xff0c;法线最后一位是补0.0 vec3 normCurrent (getMatrixWorld() …

【NodeJs】入门

目录 一、前导 二、 url模块 三、path模块 四、buffer模块 五、fs模块 六、stream流模块 七、os模块 八、crypto模块 九、util模块 十、http模块 nodejs官网 Node.js — 在任何地方运行 JavaScript nmp是Node.js包管理器&#xff0c;用来安装各种库、框架和工具&…

基于STM32的八位数码管显示和闹钟计时【Proteus仿真】

某鱼&#xff1a;两栖电子 一、系统功能 采用矩阵键盘&#xff0c;按下对应的数字再按下确认按键&#xff0c;数码管会显示自己输入的数字&#xff0c;如果按错可以使用删除按钮进行删除。点击计时按钮可以显示当前的时间。 二、使用器件 DS1302实时时钟芯片&#xff0c;8位数…

Mac虚拟机软件有什么用?

随着苹果M系列芯片电脑的推出&#xff0c;虚拟机的使用变得越来越流行。不同于苹果以往的Intel处理器电脑&#xff0c;其M系列芯片电脑无法安装双系统。如果要使用非macOS系统&#xff0c;可以通过创建虚拟机系统的方式实现。那么&#xff0c;虚拟机软件有什么作用和用途&#…

DP(动态规划)【3】 最长公共子序列 最长回文子串

目录 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 又是这个问题&#xff1a;如何读入字符串 2.最长回文子串 1.最长公共子序列 状态转移方程需要二维数组&#xff0c;1-dim已经不太够了 这里dp[i][j]是说S的前i位与T的前j位公共序列&#xff…

韩顺平0基础学java——第34天

p675-689 UDP网络编程 1.类 DatagramSocket和 DatagramPacket[数据包/数据报]实现了基于UDP协议网络程序。 2.UDP数据报通过数据报套接字DatagramSocket发送和接收&#xff0c;系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。 3.DatagramPacket对象…

FastAPI教程III

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 这部分暂无需求的没有记录&#xff0c;仅放置标题。 依赖项 安全性 中间件 你可以向FastAPI应用添加中间件。 ”中间件“是一个函数&#xff0c;它在每个请求被特定的路径操作处理之前&#xff0c;以及在每个…

植物大战僵尸融合版最新版2024蓝飘飘fly

亲爱的花园守护者们&#xff0c;是否已经厌倦了传统塔防游戏的老套模式&#xff1f;是否渴望在熟悉的《植物大战僵尸》中寻找全新的刺激体验&#xff1f;那么&#xff0c;让我们一起走进《植物大战僵尸融合版》的异想世界&#xff0c;开启一场别开生面的园艺之战吧&#xff01;…

区间动态规划——最长回文子序列长度(C++)

把夜熬成粥&#xff0c;然后喝了它。 ——2024年7月1日 书接上回&#xff1a;区间动态规划——最长回文子串&#xff08;C&#xff09;-CSDN博客&#xff0c;大家有想到解决办法吗&#xff1f; 题目描述 给定一个字符串s&#xff08;s仅由数字和英文大小写字母组成&#xff0…

以太网交换机原理

没有配置&#xff0c;比较枯燥&#xff0c;二可以认识线缆&#xff0c; 三比较重要&#xff0c;慢慢理解&#xff0c;事半功倍。 各位老少爷们&#xff0c;在下给大家说段以太网交换机原理&#xff0c;说得不好大家多多包涵&#xff0c;说得好呢&#xff0c;大家叫个好&#x…