📅  最后修改于: 2023-12-03 14:58:34.154000             🧑  作者: Mango
本题为 Sudo GATE 2020 Mock I 中的第 40 题,是一道关于门和旋转操作的问题。题目要求在给定的 $n \times m$ 个门上进行旋转操作,并计算旋转后最终开启的门的数量。其中,门的状态用整数 $0$ 或 $1$ 表示,$1$ 表示门开启,$0$ 表示门关闭,旋转操作是将某一行或某一列的所有门的状态进行翻转操作。
一种可行的算法思路如下:
统计初始状态下开启的门的数量 $cnt$。
对于每一行和每一列,通过旋转操作计算旋转后门的开启情况,并累积其对总开门数量的贡献。
最终得到的总开门数量就是最终开启的门的数量。
时间复杂度为 $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
的简写形式。