只过了样例求助qwq
查看原帖
只过了样例求助qwq
332022
ChthollyMeow楼主2020/9/17 17:35

连暴力橙题都不会打惹......捂脸/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;
}
2020/9/17 17:35
加载中...