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;
}
posted @ 2022-10-05 18:35  A-Problem-Solver  阅读(22)  评论(0编辑  收藏  举报