📜  门|门 IT 2005 |第 36 题(1)

📅  最后修改于: 2023-12-03 15:12:46.253000             🧑  作者: Mango

门|门 IT 2005 |第 36 题

本题目是门|门 IT 2005的第 36 题,要求实现一个程序,具体要求如下:

题目描述

现在有一张正整数矩阵,你可以进行若干次操作,每次操作可以将任意一行或任意一列中的数加 1。请问,你至少需要进行多少次操作,才能使矩阵中的每个数都相同?

输入格式

输入的第一行包含两个整数 n 和 m,表示矩阵的行数和列数。

接下来 n 行,每行 m 个正整数,表示矩阵中的一个数。

输出格式

输出一个整数,表示使得矩阵中每个数都相同所需的最少操作次数。

样例

输入样例:

3 3
3 1 2
4 1 4
1 5 1

输出样例:

6
题解思路

这道题目其实可以这样想,因为每一行和每一列的元素可以单独进行操作,所以我们首先要求出矩阵中的一个数,然后将每一行和每一列都变为这个数。考虑到每个数都可以当作矩阵中的某一个数,所以我们可以将整个矩阵中的所有数的平均值作为目标数。

接着,我们只需要分别计算每一行和每一列到目标数需要进行的操作次数,然后将这些操作次数加起来就是最终的结果了。

由于每次操作可以将任意一行或任意一列中的数加 1,因此对于每一行或每一列,只需要求出其中所有数的平均值即可。然后再求出这个平均值与目标数之间的差值,这个差值就是需要进行的操作次数。

代码如下:

n, m = map(int, input().split())

matrix = [list(map(int, input().split())) for _ in range(n)]

avg_num = sum([sum(row) for row in matrix]) // (n * m)
ans = 0
for i in range(n):
    # 整行的操作次数等于该行中所有数与目标数之间的差值
    ans += sum([abs(matrix[i][j] - avg_num) for j in range(m)])
for j in range(m):
    # 整列的操作次数等于该列中所有数与目标数之间的差值
    ans += sum([abs(matrix[i][j] - avg_num) for i in range(n)])

print(ans // 2)  # 因为每次操作可以将任意一行或任意一列中的数加 1,所以最终的答案要除以 2

以上就是本题的解法。