连暴力橙题都不会打惹......捂脸/dk
大概思路就是预处理出把每一行全部变成 红/白/蓝 所需要更改的颜色数,然后暴力枚举白蓝和红蓝的交界点,并统计答案。
用了前缀和维护区间和。感觉是边界炸了,但是没有发现哪里错惹....../dk
这里是代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int w[100],r[100],b[100];
int sw[100],sr[100],sb[100];
string str[60];
int n,m;
void print(){
for(int i=0;i<n;i++){
printf("i = %d , w[i] = %d , r[i] = %d , b[i] = %d , sw[i] = %d , sr[i] = %d , sb[i] = %d\n",i,w[i],r[i],b[i],sw[i],sr[i],sb[i]);
}
}
//查错
int main(void){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>str[i];
w[i]=r[i]=b[i]=m;
for(int j=0;j<m;j++){
switch(str[i][j]){
case 'W':{
w[i]--;
break;
}
case 'R':{
r[i]--;
break;
}
case 'B':{
b[i]--;
break;
}
}
}
if(i==0){
sw[i]=w[i];
sr[i]=r[i];
sb[i]=b[i];
}
else{
sw[i]=sw[i-1]+w[i];
sr[i]=sr[i-1]+r[i];
sb[i]=sb[i-1]+b[i];
}
}
// print();
int ans=0x7fffffff;
// printf("%d\n",ans);
for(int i=1;i<=n-2;i++){
for(int j=i+1;j<=n-1;j++){
int k=n-j-1;
ans=min(ans,sw[i-1]+(sb[j-1]-sb[i-1])+(sr[n-1]-sr[k]));
// printf("i = %d , j = %d , k = %d , ans = %d , qwq = %d\n",i,j,k,ans,sw[i-1]+(sb[j-1]-sb[i-1])+(sr[n-1]-sr[k]));
}
}
cout<<ans<<endl;
return 0;
}