题意:给定 n * m 个数,然后每次只能把其中一个数减少d, 问你能不能最后所有的数相等。

析:很简单么,首先这个矩阵没什么用,用一维的存,然后找那个中位数即可,如果所有的数减去中位数,都能整除d,那就是可以,并且记录数据。

代码如下:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int maxn = 500 + 5;
const int INF = 0x3f3f3f3f;
const int dr[] = {0, 0, 1, -1};
const int dc[] = {1, -1, 0, 0};
int a[maxn*maxn];

int main(){
    int n, m, d;
    cin >> n >> m >> d;
    int cnt = 0;
    for(int i = 0; i < n * m; ++i)  cin >> a[cnt++];
    sort(a, a+cnt);
    int x = a[cnt/2];
    int ans = 0;
    for(int i = 0; i < cnt; ++i){
        if(abs(a[i] - x) % d){
            printf("-1\n");
            return 0;
        }
        ans += abs(a[i] - x) / d;
    }
    cout << ans << endl;
    return 0;
}