📌  相关文章
📜  门| Sudo GATE 2020 Mock I(2019 年 12 月 27 日)|第 63 题(1)

📅  最后修改于: 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)$。