题解:CF2069B Set of Strangers
Statement
给定一个 的矩阵,第 行 列的方格颜色为 。
如果两个方格并不共享边,我们称其为陌生的方格,对于一个又陌生的方格组成的集合,若该集合内方格元素均相同,我们可以将集合内的方格同意涂成另一种颜色。
你需要最少多少操作次数使得所有方格颜色相同。
。
Solution
如果说有共享边且颜色相同的方格,显然操作次数会多一次,并且要涂掉一个颜色操作数不是 就是 ,因为如果同一颜色方格没有共享变一次就可以涂完。
开值域桶记每个颜色的操作数,统计操作数和减去最大操作数就是答案。
Code
#include <bits/stdc++.h>
using namespace std;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int T, n, A[777][777], B[500005], m;
signed main() {
scanf ("%d", &T);
while (T --) {
scanf ("%d %d", &n, &m);
fill (B + 1, B + n * m + 1, 0LL);
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
scanf ("%d", &A[i][j]);
}
}
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
bool flag = false;
for (int k = 0; k < 4; k ++) {
int nx = i + dx[k], ny = j + dy[k];
if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
if (A[i][j] == A[nx][ny]) {
flag = true;
break;
}
}
B[A[i][j]] = max (B[A[i][j]], 1 + flag);
}
}
int Sum = 0, tot = 0;
for (int i = 1; i <= n * m; i ++)
tot = max (tot, B[i]), Sum += B[i];
printf ("%d\n", Sum - tot);
}
return 0;
}
本文作者:Tomori's Blog
本文链接:https://www.cnblogs.com/Tomori0505/p/18725731
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步