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

news2025/2/26 3:07:34


一个认为一切根源都是“自己不够强”的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.coloradmin.cn/o/1880722.html

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

相关文章

2024 vue3入门教程:windows系统下部署node环境

一、打开下载的node官网 Node.js — 下载 Node.js 二、根据个人喜好的下载方法&#xff0c;下载到自己的电脑盘符下 三、我用的是方法3下载的压缩包&#xff0c;解压到E盘nodejs目录下&#xff08;看个人&#xff09; 四、配置电脑的环境变量&#xff0c;新建环境变量的时候…

树莓派4B学习笔记17:RBG_LED全色域灯的驱动模块编写

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: ​ Python 版本3.7.3&#xff1a; ​ 今日学习&#xff1a;RBG_LED全色域灯的驱动模块编写…

初学者轻松搞定19个经典的Python程序以及代码演示

Python的经典程序展示了Python语言基本特性和功能的简单示例,这些程序在学习和理解Python编程语言的过程中起着至关重要的作用. 一些常见的经典Python程序及其在学习Python时的功能&#xff1a; 1.Hello, World! print("Hello, World!")解释:这是Python的基本输出…

(单机架设教程)凯旋|当年的QQ游戏

前言 今天给大家带来一款单机游戏的架设&#xff1a;凯旋 &#xff0c; 当年的QQ游戏 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; 凯旋单机 搭建教程 此游戏架设需要安装虚拟机&#xff0c; 没有…

【面试系列】Python 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

基于源码详解ThreadPoolExecutor实现原理

个人博客地址 基于源码详解ThreadPoolExecutor实现原理 | iwts’s blog 内容拆分 这里算是一个总集&#xff0c;内容太多&#xff0c;拆分成几个比较重要的小的模块&#xff1a; ThreadPoolExecutor基于ctl变量的声明周期管理 | iwts’s blog ThreadPoolExecutor 工作线程…

【PL理论深化】(13) 变量与环境:文法结构 | 真假表达式:isZero E | let 表达式叠放 | 定义的规则 | 条件语句的使用

&#x1f4ac; 写在前面&#xff1a;从现在开始&#xff0c;让我们正式设计和实现编程语言。首先&#xff0c;让我们扩展在之前定义的整数表达式语言&#xff0c;以便可以使用变量和条件表达式。 目录 0x00 文法结构 0x01 真假表达式&#xff1a;isZero E 0x02 let 表达式叠…

1-5题查询 - 高频 SQL 50 题基础版

目录 1. 相关知识点2. 例题2.1.可回收且低脂的产品2.2.寻找用户推荐人2.3.大的国家2.4. 文章浏览 I2.5. 无效的推文 1. 相关知识点 sql判断&#xff0c;不包含null&#xff0c;判断不出来distinct是通过查询的结果来去除重复记录ASC升序计算字符长度 CHAR_LENGTH() 或 LENGTH(…

LeetCode-Leetcode 1120:子树的最大平均值

LeetCode-Leetcode 1120&#xff1a;子树的最大平均值 题目描述&#xff1a;解题思路一&#xff1a;递归解题思路二&#xff1a;0解题思路三&#xff1a;0 题目描述&#xff1a; 给你一棵二叉树的根节点 root&#xff0c;找出这棵树的 每一棵 子树的 平均值 中的 最大 值。 子…

文章浮现之单细胞VDJ的柱状图

应各位老师的需求复现一篇文章的中的某个图 具体复现图5的整个思路图&#xff0c;这里没有原始数据&#xff0c;所以我使用虚拟生产的metadata进行画图 不废话直接上代码&#xff0c;先上python的代码的结果图 import matplotlib.pyplot as plt import numpy as np# 数据&#…

RocketMQ常用基本操作

文章中的rabbitmq使用的是rocketmq-all-5.1.3-bin-release版本&#xff0c;需要安装包的可自行下载 RockerMQ启动停止命令 启动命令 nohup sh bin/mqnamesrv & nohup sh bin/mqbroker -n localhost:9876 --enable-proxy & 查看日志 tail -f ~/logs/rocketmqlogs/…

sqlmap注入详解

免责声明:本文仅做分享... 目录 1.介绍 2.特点 3.下载 4.帮助文档 5.常见命令 指定目标 请求 HTTP cookie头 HTTP User-Agent头 HTTP协议的证书认证 HTTP(S)代理 HTTP请求延迟 设定超时时间 设定重试超时 设定随机改变的参数值 利用正则过滤目标网址 避免过多的…

江大白 | 何凯明入职 MIT,首次带队提出Diffusion Loss,扩散模型思想提升生成速度和效果 !

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;何凯明入职 MIT&#xff0c;首次带队提出Diffusion Loss&#xff0c;扩散模型思想提升生成速度和效果 &#xff01; 导读 在图像生成领域中&#xff0c;作…

在数字化转型中,中小企业如何打造数字化产品和服务?

引言&#xff1a;随着社会的发展和消费者行为的变化&#xff0c;市场对数字化产品和服务的需求日益增长。中小企业需要紧跟这一趋势&#xff0c;通过开发数字化产品和服务来满足消费者的新需求。云计算、大数据、人工智能等先进技术的出现&#xff0c;为中小企业提供了更多的机…

志愿填报指南:为什么我强烈建议你报考计算机专业

首先恭喜2024届高考的同学们&#xff0c;你们已经通过了高考的考验&#xff0c;即将进入人生的新阶段——大学。 现在正是高考完填报志愿的时刻&#xff0c;Left听到身边朋友提到报考志愿的诸多问题&#xff1a; 志愿填报怎么填&#xff1f;我要报考什么专业&#xff1f;这个…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点&#xff0c;有学者在小波分析基础上引入调频算子构成了线性调频小波变换&#xff0c;线调频小波一方面继承了小波变换的理论完善性&#xff0c;另一方面用一个新的参数&#xff08;线调频参数&#xff09;刻…

ONLYOFFICE 桌面编辑器 8.1 现已发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等

继 ONLYOFFICE 文档 8.1 发布后&#xff0c;适用于 Linux、Windows 和 macOS 的 ONLYOFFICE 桌面应用程序最新版本也已推出。它具有在线套件的最主要功能&#xff0c;例如功能齐全的 PDF 编辑器、演示文稿中的幻灯片版式、改进的 RTL 支持、新的本地化选项等。 点击进入ONLYOF…

vue中【事件修饰符号】详解

在Vue中&#xff0c;事件修饰符是一种特殊的后缀&#xff0c;用于修改事件触发时的默认行为。以下是Vue中常见的事件修饰符的详细解释&#xff1a; .stop 调用event.stopPropagation()&#xff0c;阻止事件冒泡。当你在嵌套元素中都有相同的事件监听器&#xff08;如click事件…

100张linux C/C++工程师面试高质量图

文章目录 杂项BIOSlinux开机启动流程内核启动流程网络编程网络编程流程tcp状态机三次握手四次断开reactor模型proactor模型select原理poll原理epoll原理文件系统虚拟文件系统文件系统调用阻塞IO非阻塞IO异步IO同步阻塞同步非阻塞IO多路复用进程管理进程状态程序加载内存管理MMU…

【高中数学/基本不等式】已知:x,y皆为正实数,且2xy+x+6y=6 求:x+2y的最小值

【题目】 已知&#xff1a;x,y皆为正实数&#xff0c;且2xyx6y6 求&#xff1a;x2y的最小值 【解答】 解法一&#xff1a;因为2xyx6y6 可转换为(x3)(2y1)-36 得到(x3)(2y1)9 而x2yx3-32y1-1 (x3)(2y1)-4 >2*根号下[(x3)(2y1)]-4 2*3-4 2 解法二&#xff1a…