题解: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
*/

浙公网安备 33010602011771号