1 条题解
-
0
暴力枚举多少行白、多少行蓝
#include <bits/stdc++.h> using namespace std; int n, m; char g[55][55]; int main() { // 输入 cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> g[i][j]; // 枚举所有情况 int ans = n * m; for (int a = 1; a <= n - 2; a++) for (int b = 1; b <= n - a - 1; b++) { int c = n - a - b; // a行白色、b行蓝色、c行红色,要涂几次 int now = 0; // 1~a 行有几个不是白色 a+1~a+b 行有几个不是蓝色,a+b+1~n 行有几个不是红色 for (int i = 1; i <= a; i++) for (int j = 1; j <= m; j++) if (g[i][j] != 'W') now++; for (int i = a + 1; i <= a + b; i++) for (int j = 1; j <= m; j++) if (g[i][j] != 'B') now++; for (int i = a + b + 1; i <= n; i++) for (int j = 1; j <= m; j++) if (g[i][j] != 'R') now++; ans = min(ans, now); } cout << ans; return 0; }
提前预处理每行每种颜色的数量
#include <bits/stdc++.h> using namespace std; int n, m; char g[55][55]; int cnt[55][3]; // cnt[i][0/1/2] 第 i 行白蓝红的数量 int main() { // 输入 cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { cin >> g[i][j]; if (g[i][j] == 'W') cnt[i][0]++; else if (g[i][j] == 'B') cnt[i][1]++; else cnt[i][2]++; } // 枚举所有情况 int ans = n * m; for (int a = 1; a <= n - 2; a++) for (int b = 1; b <= n - a - 1; b++) { int c = n - a - b; // a行白色、b行蓝色、c行红色,要涂几次 int now = 0; // 1~a 行有几个不是白色 a+1~a+b 行有几个不是蓝色,a+b+1~n 行有几个不是红色 for (int i = 1; i <= a; i++) now += cnt[i][1] + cnt[i][2]; for (int i = a + 1; i <= a + b; i++) now += cnt[i][0] + cnt[i][2]; for (int i = a + b + 1; i <= n; i++) now += cnt[i][0] + cnt[i][1]; ans = min(ans, now); } cout << ans; return 0; }
前缀和优化区间和的计算
略
- 1
信息
- ID
- 4197
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 6
- 已通过
- 5
- 上传者