Date: 2023年1月9日
Author: 小 y 同 学
Classify: 蓝桥杯每日一练
Language: Python
题意
M海运公司最近要对旗下仓库的货物进出情况进行统计。目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志。该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装箱重量;第二类操作为集装箱的出库操作。这些记录都严格按时间顺序排列。集装箱入库和出库的规则为先进后出,即每次出库操作出库的集装箱为当前在仓库里所有集装箱中最晚入库的集装箱。
出于分析目的,分析人员在日志中随机插入了若干第三类操作――查询操作。分析日志时,每遇到一次查询操作,都要报告出当前仓库中最大集装箱的重量。输入格式
包含N+1行:
第一行为1个正整数N,对应于日志内所含操作的总数。
接下来的N行,分别属于以下三种格式之一:
格式1: 0 X 表示一次集装箱入库操作,正整数X表示该次入库的集装箱的重量
格式2: 1 表示一次集装箱出库操作,(就当时而言)最后入库的集装箱出库
格式3: 2 表示一次查询操作,要求分析程序输出当前仓库内最大集装箱的重量
当仓库为空时你应该忽略出库操作,当仓库为空查询时你应该输出0。输出格式
输出行数等于日志中查询操作的次数。每行为一个正整数,表示查询结果。样例输入1
13 0 1 0 2 2 0 4 0 2 2 1 2 1 1 2 1 2
- 样例输出1
2 4 4 1 0
- 提示
使用栈的思路,可以练习一下API的使用。
对于20%的数据,有 N ≤ 10 N\le 10 N≤10;
对于40%的数据,有 N ≤ 1000 N\le 1000 N≤1000;
对于100%的数据,有 N ≤ 200000 , X ≤ 1 0 8 N\le 200000,X\le 10^8 N≤200000,X≤108。
题目梳理
题目的意思还是比较清晰的,要实现的功能:对一个仓库进行有三种操作:第一种是0 X操作,即向仓库中放入重量为X的集装箱;第二种操作为1操作,取出上一次0操作放入的集装箱,第三种操作为2操作,查询仓库集装箱重量最大值。
数据输入
对于N的输入,直接N = int(input())
;对于操作的输入,由于0操作有两个值,1和2操作只有一个值,小y还是打算用列表来存储操作,然后判断列表中第0个元素的值来进行相应操作。核心处理
我们可以采用列表来存放集装箱的质量,通过列表自身的append方法来放入集装箱,append方法是将对应元素放入到列表的最后一个位置,列表的remove移除最后一个元素,使用max函数求的列表元素最大值;同时我们在写判断语句时应该注意列表元素为空的1操作和2操作。
但是上述写法数据过大判断最大值时会引起超时,于是又开辟了一个新的列表存储最大值,具体可以查看优化代码。
- 标准源码
# _*_coding:utf-8_*_ # created by cy on 2023/1/9 def solve(): w = [] # 仓库 N = int(input()) # 操作总数 for k in range(N): x = list(map(int, input().split())) # 操作 if x[0] == 0: w.append(x[1]) elif w and x[0] == 1: w.remove(w[-1]) # 仓库不为空移除最后一个元素 elif x[0]==2: if w: print(max(w)) # 仓库不为空打印max else: print(0) # 仓库为空打印0 if __name__ == "__main__": solve()
- 面向对象源码
# _*_coding:utf-8_*_ # created by cy on 2023/1/9 class Warehouse: def __init__(self): self.w = [] def zero(self, p): self.w.append(p[1]) def one(self, p): if self.w: self.w.remove(self.w[-1]) def two(self, p): print(max(self.w)) if self.w else print(0) if __name__ == "__main__": ww = Warehouse() for i in range(int(input())): p = list(map(int, input().split())) if p[0] == 0: ww.zero(p) elif p[0] == 1: ww.one(p) elif p[0] == 2: ww.two(p)
- 优化代码
# _*_coding:utf-8_*_ # created by cy on 2023/1/9 def solve(): w = [0] # 仓库 w_max = [0] for k in range(int(input())): x = list(map(int, input().split())) # 操作 if x[0] == 0: w.append(x[1]) w_max.append(max(w_max[-1], x[1])) # 更新最大值 elif w[-1]!=0 and x[0] == 1: w.pop() # 仓库不为空移除最后一个元素 w_max.pop() elif x[0] == 2: if w[-1]!=0: print(w_max[-1]) # 仓库不为空打印max else: print(0) # 仓库为空打印0 if __name__ == "__main__": solve()
小y的今日一练到此画上了句号,欢迎友友们多给建议
有兴趣一起学习编程的小伙伴可以私聊小y一起学习,小y在Python,c/c++和matlab语言上均有一定的基础