#28分求助!!!!!
  • 板块P3392 涂国旗
  • 楼主xmh7213
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/10/14 11:08
  • 上次更新2023/11/4 03:51:45
查看原帖
#28分求助!!!!!
407889
xmh7213楼主2021/10/14 11:08

#include<bits/stdc++.h>
using namespace std;
char a[60][60];
int W[60],B[60],R[60];

int main()
{
	int N,M;//N行M列

cin>>N>>M;memset(W,0,sizeof(W));memset(R,0,sizeof(R));memset(B,0,sizeof(B));
	int sum=0,flag;
	int tempi,maxb,maxr,maxw;
	for(int i=1;i<=N;++i){
		for(int j=1;j<=M;j++){
			cin>>a[i][j];
		}
	}
	//设1--n行涂W,n+1---m行涂B,m+1---N涂R
	for(int i=1;i<=N;++i){
		for(int j=1;j<=M;j++){
			if(a[i][j]=='W') W[i]++;
			if(a[i][j]=='B') B[i]++;
			if(a[i][j]=='R') R[i]++;//每一行的价值算了出来 
		}//取最大值改变。 
	} 
	int max=B[1];
	for(int i=2;i<=N-1;++i)	{
		if(max<B[i]){
			tempi=i;
			maxb=B[i];//记录下最大的B色 
			maxr=R[i];
			maxw=W[i];
		}
	}
//	for(int j=1;j<=M;j++) {//修改第一行和最后一行 
//		a[1][j]='W';a[N][j]='R';
		sum+=M-W[1]+M-R[N];//第一行修改的
		W[1]=M;R[N]=M; 
//	} 
	//条件:上一行必须是同色或者是上面该涂的才能改变
	for(int i=2;i<=N-1;i++){//从第二行到倒数2行 
		if(W[i-1]==M)//如果上一行全为W,则下一行可以为W,B
		{
			if(W[i]>B[i])//优先涂W
			{
				sum+=M-W[i];//sum加上需要修改的个数 
				W[i]=M;R[i]=0;B[i]=0;	
			 } 
			 else {//涂B 
			 	sum+=M-B[i];B[i]=M;//全涂上了
				 R[i]=0;W[i]=0;	
			 }
		 } 
		if(B[i-1]==M)//如果上一行全为B,则下一行可以为B,R
		{
			if(B[i]>=R[i])//优先涂B
			{
				sum+=M-B[i];flag=1;
				B[i]=M;//全涂上了
				R[i]=0;W[i]=0;	
			 } 
			 else {
			 	sum+=M-R[i];R[i]=M;
			 	B[i]=0;W[i]=0;
			 }
		 } 
		 if(R[i-1]==M)// 如果上一行全为R,则下一行只能为R
		{
			sum+=M-R[i];R[i]=M;
			B[i]=0;W[i]=0;
		 } 
	}
	if(flag)
	cout<<sum;//现在问题,B不一定有 
	else//如果没有B,则该涂B的位置 ,则几乎全是W,+1行R 
	{
		sum=sum-(M-maxb)+M-maxb;cout<<sum;
	}
	
	return 0;
 } 
2021/10/14 11:08
加载中...