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;
}
posted @ 2021-12-16 11:35  Eason_AC  阅读(40)  评论(0)    收藏  举报