测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A21389. 砖块消除问题有一个砖块消消乐游戏,游戏画面由 n 列砖组成,每列都有若干块砖,每块砖都是 1×1 的正方形且砖块之间排列整齐(每块砖的厚度及砖块之间的缝隙忽略不计)。玩家每次可以按照以下要求,选定一个矩形区域,将该矩形区域的所有砖块消除:该矩形区域内每块砖都是完整的,即不能选定某块砖的一部分。例如:可以选择下方左图中的矩形区域(绿色框),不可以选定下方右图中的矩形区域(红色框)。2. 该矩形区域…

填空题 较难

题目描述

砖块消除问题

有一个砖块消消乐游戏,游戏画面由 n 列砖组成,每列都有若干块砖,每块砖都是 1×1 的正方形且砖块之间排列整齐(每块砖的厚度及砖块之间的缝隙忽略不计)。

玩家每次可以按照以下要求,选定一个矩形区域,将该矩形区域的所有砖块消除:

该矩形区域内每块砖都是完整的,即不能选定某块砖的一部分。例如:可以选择下方左图中的矩形区域(绿色框),不可以选定下方右图中的矩形区域(红色框)。

2. 该矩形区域内不能有空白部分。例如:不可以选定下图中的矩形区域(红色框)。

给定砖的列数 n,以及从左至右每列砖的砖块数量,请计算消除完所有砖块最少需要选定多少次矩形区域。

例如:n = 3;从左至右列砖的砖块数量分别是 2、3、2,将所有砖块全部消除最少需要选定 2 次。 

第 1 次,选定绿色框的矩形区域,将 6 块砖消除,剩余 1 块砖;

第 2 次,选定剩余的 1 块砖并消除。 

输入描述

1. 第一行输入一个整数 n(1 ≤ n ≤ 1e5),表示有多少列砖;

2. 第二行输入 n 个整数(1 ≤ 整数 ≤ 100),分别表示从左至右每列砖的砖块数量,整数之间以一个空格隔开。

输出描述

输出一个整数,表示消除完所有砖块最少需要选定多少次矩形区域。

样例输入

3
2 3 2

样例输出

2

参考答案

n = int(input()) h = list(map(int, input().split()))  # 存储每列砖块的初始高度 count = 0  # 记录最少消除次数 while True:    # 步骤1:检查是否所有砖块都已消除     all_zero = True     min_h = float('inf')  # 记录当前非零高度中的最小值     for num in h:         if num > 0:             all_zero = False             if num < min_h:             min_h = num  # 更新最小高度         if all_zero:             break               # 所有砖块消除完毕,退出循环                 # 步骤2:统计当前非零高度的连续段数量(每段可一次消除)         segments = 0         in_segment = False  # 标记是否处于连续段中         for num in h:             if num > 0:                 if not in_segment:                  # 进入新的连续段,计数+1                 segments += 1                 in_segment = True             else:            # 离开连续段                 in_segment = False          count += segments           # 累加本次消除的段数              # 步骤3:将当前所有非零高度减去最小高度(模拟消除这部分砖块          for i in range(n):              if h[i] > 0:                  h[i] -= min_h print(count)
上一题 下一题