CF289B Polo the Penguin and Matrix 题解
Content
有一个 \(n\times m\) 的矩阵 \(A\),每次操作你可以将某一个元素增加或减少 \(d\),求是所有元素相等的最小操作次数,或者不存在这样的操作方案。
数据范围:\(1\leqslant n,m\leqslant 100\),\(1\leqslant A_{i,j},d\leqslant 10^4\)。
Solution
提供一种 \(\Theta(n^2m^2)\) 的做法。
首先一个很显然的结论,若所有元素对 \(d\) 取模之后的值不完全相等,那么就不存在操作方案,因为你无论怎么加减 \(d\),都无法使 \(A\) 中的所有元素全都相等。
否则,先 \(\Theta(nm)\) 枚举出每一个 \(A_{i,j}\),然后再 \(\Theta(nm)\) 计算出 \(\sum\limits_{k=1}^n\sum\limits_{l=1}^m |A_{k,l}-A_{i,j}|\),然后取最小值。这种复杂度在这道题目里面是足够可以过的。
Code
int n, m, d, a[107][107], vis[10007], ans = 0x3f3f3f3f;
int main() {
n = Rint, m = Rint, d = Rint;
F(i, 1, n) F(j, 1, m) vis[(a[i][j] = Rint) % d]++;
F(i, 1, n) F(j, 1, m) if(vis[a[i][j] % d] < n * m) return printf("-1"), 0;
F(i, 1, n) F(j, 1, m) {
int sum = 0;
F(k, 1, n) F(l, 1, m) sum += abs(a[k][l] - a[i][j]) / d;
ans = min(ans, sum);
}
return write(ans), 0;
}