📅  最后修改于: 2023-12-03 15:12:45.305000             🧑  作者: Mango
有 n 个门排成一排,每个门都有一个开门的密码。任意两个门之间可能隔着门锁着的门,也可能紧挨着,不隔门。每个门上的密码均为一个二进制数,第 i 个门的密码为 Si。
你可以按照任意顺序确定每个门的开关状态,使得最终所有门都打开。每次你会选择两个状态“0” 和 “1”,并将所有密码二进制的这些位“0” 全部变成“1”,或者将所有密码二进制的这些位“1”全部变成“0”。
你需要编写代码帮忙确定最少需要进行多少次操作,才能使得所有门都打开。
第一行包含一个整数 n,表示门的数量。
接下来 n 行,每行包含一个长度为 k 的二进制字符串,表示某个门的密码。
输出一个整数,表示最少需要进行的操作次数。
1 <= n <= 1000 1 <= k <= 15
输入: 3 01 10 00 输出: 2
从最高位开始考虑,某一位为0的门肯定是需要进行操作的,因为该位的1只有变成0才能保证与其他门的操作次数最少,同样的,该位为1的门也是需要进行操作的。
对于第一位操作完成后,剩下的问题就是对除去第一位的其他位进行操作的次数了,依次类推,直到所有置0的操作完成为止。
代码如下,时间复杂度为O(nk)。
def min_op(n, S):
k = len(S[0])
res = 0
for j in range(k):
one, zero = 0, 0
for i in range(n):
if S[i][j] == '1':
one += 1
else:
zero += 1
res += min(one, zero)
return res
n = int(input())
S = []
for i in range(n):
S.append(input())
print(min_op(n, S))