1 条题解

  • 0
    @ 2024-1-20 16:33:58
    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e6+10;
    
    char gq[51][51];
    int w[51],b[51],r[51],n,m,rr,bb,ww;
    // w[]数组用来存每一行要涂成白色的格子数
    // b[]数组用来存每一行要涂成蓝色的格子数
    // r[]数组用来存每一行要涂成红色的格子数
    // n 行数, m 列数
    
    int main(){
        cin>>n>>m;
        // 初始化数据
        for(int i=1;i<=n;i++){
            rr=0; //rr,bb,ww为记录每行涂成红色、黑色、白色的计数器,每次新的一行要重置。
            bb=0;
            ww=0;
            for(int j=1;j<=m;j++){
                cin>>gq[i][j]; //输入格子的颜色
                if(gq[i][j]!='W') ww+=1;// 如果格子不等于白色,则计数器ww加一
                if(gq[i][j]!='R') rr+=1;// 如果格子不等于红色,则计数器rr加一
                if(gq[i][j]!='B') bb+=1;// 如果格子不等于蓝色,则计数器bb加一
            }
            w[i]=ww;
            b[i]=bb;
            r[i]=rr;
        }
        // 遍历合法国旗的所有情况
        int min=n*m;
        for(int i=1;i<=n-2;i++){ //遍历白色和红色的分解线,最后一行白色的位置
            for(int j=i+1;j<=n-1;j++){// 遍历蓝色和红色的分界线,最后一行蓝色的位置
                int sum=0; // sum是计数器,用来记录当前国旗的情况下,要涂多少个格子
                for(int k=1;k<=i;k++){ // 将所有白色行所要付出的代价累加到sum计数器中
                    sum+=w[k];
                }
                for(int k=i+1;k<=j;k++){ // 将所有蓝色行所要付出的代价累加到sum计数器中
                    sum+=b[k];
                }
                for(int k=j+1;k<=n;k++){ // 将所有红色行所要付出的代价累加到sum计数器中
                    sum+=r[k];
                }
                if(sum<min){ // 擂台法求出最小的代价
                    min = sum;
                }
            }
        }
        cout<<min;
        return 0;
    }
    
    • 1

    信息

    ID
    394
    时间
    1000ms
    内存
    64MiB
    难度
    10
    标签
    递交数
    3
    已通过
    0
    上传者