题目
设计一个算法,用最少数量的矩形覆盖一系列宽度为d、高度为w的矩形建筑物侧墙,且矩形不能超出边界。
核心思路
考虑这种结构
前面递增后面一个与前面的某个高度一致,这时候考虑最下面的覆盖(即都是从最下面向上覆盖)
考虑到使用栈,这里我们用列表代替
当栈不为空并且新元素比栈顶小,这时候存在这种可能结构成立,
对每个墙循环,如果新元素比栈顶元素大,就进栈;
反之,如果新元素比栈顶元素小,就使得栈顶元素出栈,继续比较新栈顶元素与当前使用新元素的大小,一直到比较到当前使用新元素和之前的某个元素的大小相同,此时计数器+1,表示找到这种结构+1
另外向上因为与数量一致,所以这里不考虑
伪代码
定义一个函数 main:
定义一个变量 n,用于存储输入的整数。
定义一个变量 ans,初始化为 0,用于存储最终答案。
定义一个空列表 st,用于模拟栈结构。
对于从 1 到 n 的每个整数 i:
读取两个整数 d 和 w,并将它们分别存储到变量 d 和 w 中。
当列表 st 不为空且 w 小于等于 st 中最后一个元素时:
如果 st 中最后一个元素等于 w:
将 ans 的值增加 1。
从 st 中移除最后一个元素,因为当前 w 值破坏了递增结构。
将 w 添加到 st 的末尾。
打印 n 减去 ans 的结果。
如果这个脚本是主程序:
调用 main 函数。
CODE
def main():
n = int(input())
# 这种结构有多少种
ans = 0
st = []
for i in range(1, n + 1):
d, w = map(int, input().split())
# 列表类似栈的结构
while st and w <= st[-1]:
# 找到该种结构种类数+1
if st[-1] == w:
ans += 1
# pop掉,因为该种结构要求前面都是递增,而这里当前使用新元素已经是破坏了
# 递增结构,所以直接丢掉,准备下一次的
# 最后栈是空的,上面循环直接刷到最前面了
st.pop()
st.append(w)
print(n - ans)
if __name__ == "__main__":
main()