📅  最后修改于: 2023-12-03 15:28:47.201000             🧑  作者: Mango
这是一道来自于 Sudo GATE 2020 Mock I(2019 年 12 月 27 日)的编程题目。
一个有 n 个门的大楼,门的状态可能是开、关、锁的其中之一。门是按照从左到右的次序编号的,门的编号从 1 到 n,其中 n 是给定的正整数。
你有一把无限耐久性的钥匙,你可以使用这把钥匙来打开所有的锁,同样地,你也可以使用这把钥匙来锁上除了开着的门以外的所有门。但是钥匙无法开启开着的门。
你可以使用以下操作中的一种来转换任意一扇门:
你需要使用最少的步骤来将所有的门都变为开着的状态。
第一行包含一个正整数 n,表示门的数量。
接下来 n 行,每行包含一个字符串,表示当前门的状态。字符串的每个字符都是 "0"、"1" 或 "2",其中 "0" 表示该门关闭,"1" 表示该门开启,"2" 表示该门上了锁。
输出一个整数,表示将所有的门都变为开着的状态所需要的最少步骤数。
5
0121
0011
0111
0121
0110
10
本题需要从每个门的状态入手,分别计算出打开、锁上、关闭所需要的步骤数。
首先,对于每个门的状态,它只能通过以下几种方法转换:
因此,我们可以统计每个门的初始状态和目标状态之间需要执行的操作数,然后将所有门的操作数加起来,得到最终的结果。
n = int(input())
doors = [input() for _ in range(n)]
cnt = 0
for door in doors:
# 统计需要执行的操作数
cnt += (door.count('0') # 从开的状态转换到关闭的状态
+ door.count('2') # 从开的状态转换到锁的状态
+ 2 * door.count('1') # 从锁的状态转换到开的状态
+ door.count('2') # 从锁的状态转换到关闭的状态
)
print(cnt)
时间复杂度:$O(n)$。