1 条题解

  • 0
    @ 2025-7-6 15:56:49

    暴力枚举多少行白、多少行蓝

    #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
    上传者