题解:AT_agc066_a [AGC066A] Adjacent Difference

并不困难的题。

题意:很简单了,不再赘述。

做法:

注意到我们只需要给出来一种构造就行了,不用最小化任何东西,我们可以考虑直接黑白染色,然后考虑让黑色点成为奇数倍的 \(d\),白点成为偶数倍的 \(d\),或者相反。

因为注意到对于一个点,要不然向上取,要不然向下取,所两种方法总共是 \(n^2d\) 的代价的,一定有一种可以达成。

然后一点实现上的细节,当一个数是负数且不满足我们要求的奇偶性时,我们会让他向下取,整数则向上取。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 505, mod = 998244353, N = 6000;
int n, a[maxn][maxn], k, b[maxn][maxn];
signed main() {
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cin >> a[i][j];
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int t = a[i][j] / k;
			if((i + j + t) % 2)
				t += (a[i][j] >= 0 ? 1 : -1);
			sum += abs(a[i][j] - t * k);
			b[i][j] = t * k;
		}
	}
	if(sum * 2 > n * n * k) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				int t = a[i][j] / k;
				if((i + j + t) % 2 == 0)
					t += (a[i][j] >= 0 ? 1 : -1);
				sum += abs(a[i][j] - t * k);
				b[i][j] = t * k;
			}
		}
	}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			cout << b[i][j] << (j == n ? '\n' : ' ');
	return 0;
}
/*
2 
1 3
2 4
*/
posted @ 2025-07-22 21:30  LUlululu1616  阅读(71)  评论(0)    收藏  举报