📌  相关文章
📜  门| Sudo GATE 2020 Mock II(2019 年 1 月 10 日)|第 38 题(1)

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