C o d e f o r c e s 1 6 6 0 E
思路
设总共有 $ x $ 个 $ 1 $ 。
左 Shift $ n $ 次,每次都检查一下主对角线上有多少个 $ 1 $ ,越多越好。(因为我们主对角线上要全部是 $ 1 $)
设最多的对角线有 $ y $ 个 $ 1 $ 。
由于对角线有 $ n $ 个元素,所以需要变 $ n - y $ 个元素为 $ 1 $ 。
由于除对角线外有 $ x - y $ 个 $ 1 $ ,所以需要变 $ x - y $ 个元素为 $ 0 $ 。
所以答案为 $ n + x - 2y $ 。
代码
#include <bits/stdc++.h>
using namespace std;
int a[2005][2005];
char s[2005];
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n;
scanf("%d", &n);
int sum = 0, mx = 0;
for (int i = 0; i < n; i++) {
scanf("%s", s);
for (int j = 0; j < n; j++) {
a[i][j] = s[j] - '0';
sum += a[i][j];
}
}
for (int i = 0; i < n; i++) {
int this_ans = 0;
for (int j = 0; j < n; j++) {
this_ans += a[j][(i + j) % n];
}
mx = max(mx, this_ans);
}
printf("%d\n", n + sum - 2 * mx);
}
return 0;
}