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

📅  最后修改于: 2023-12-03 14:58:34.154000             🧑  作者: Mango

题目介绍

本题为 Sudo GATE 2020 Mock I 中的第 40 题,是一道关于门和旋转操作的问题。题目要求在给定的 $n \times m$ 个门上进行旋转操作,并计算旋转后最终开启的门的数量。其中,门的状态用整数 $0$ 或 $1$ 表示,$1$ 表示门开启,$0$ 表示门关闭,旋转操作是将某一行或某一列的所有门的状态进行翻转操作。

算法思路

一种可行的算法思路如下:

  1. 统计初始状态下开启的门的数量 $cnt$。

  2. 对于每一行和每一列,通过旋转操作计算旋转后门的开启情况,并累积其对总开门数量的贡献。

  3. 最终得到的总开门数量就是最终开启的门的数量。

时间复杂度为 $O(nm(n+m))$。

解题代码

def rotate_doors(doors):
    n, m = len(doors), len(doors[0])
    cnt = sum(doors[i][j] for i in range(n) for j in range(m))
    for i in range(n):
        if doors[i][0] == 0:
            for j in range(m):
                doors[i][j] ^= 1
    for j in range(1, m):
        if doors[0][j] == 0:
            for i in range(n):
                doors[i][j] ^= 1
    cnt_rotate = sum(doors[i][j] for i in range(n) for j in range(m))
    return cnt_rotate if cnt_rotate > cnt else cnt

n, m = map(int, input().split())
doors = [list(map(int, input().split())) for _ in range(n)]
result = rotate_doors(doors)
print(result)

其中,rotate_doors() 函数用于计算旋转后最终开启的门的数量,doors 是一个 $n \times m$ 的列表,存储着门的开启状态。函数内部首先统计初始状态下开启的门的数量 $cnt$,然后对每一行和每一列进行旋转操作,最后统计最终开启的门的数量并返回。函数中的 ^= 运算符是按位异或赋值运算符,表示按位异或并将结果赋值给左操作数,相当于执行 a = a ^ b 的简写形式。