1 条题解
-
0
#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
- 上传者