样例和自己造的多组大数据都过了,结果14分,求助
查看原帖
样例和自己造的多组大数据都过了,结果14分,求助
228788
ChangYiMing楼主2020/10/4 12:46

前缀和优化 O(n^2)


#include <stdio.h>
#define ll long long
using namespace std;

int read(){
	int a1=0,k1=1;char c1=getchar();
	while(c1<'0'||c1>'9'){
		if(c1=='-')k1=-1;c1=getchar();
	}
	while(c1>='0'&&c1<='9'){
		a1=a1*10+c1-'0';
		c1=getchar();
	}
	return a1*k1;
}
inline void out1(ll n) {
	if(n < 0)
		putchar ('-') , n = -n;
	if(n > 9)
		out1(n / 10);
	putchar(n % 10 + '0');
}
inline void out(ll n){
	out1(n);printf("\n");
}
int sumW[55],sumB[55],sumR[55];
char a[55][55];
int/*signed*/ main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	int n=read(),m=read(),x,ans=1<<30;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			scanf("%c",&a[i][j]);
		}
		scanf("\n");
	}
//	for(int i=1;i<=n;++i){
//		for(int j=1;j<=m;++j){
//			printf("%c ",a[i][j]);
//		}printf("\n");
//	}
	for(int i=1;i<n;++i){                 //涂W前缀和
		x=0;
		for(int j=1;j<=m;++j){
			if(a[i][j]!='W')x++;
//			x+=(a[i][j]!='W');
		}
		sumW[i]=sumW[i-1]+x;
//		printf("%d ",sumW[i]);
	}
//	printf("\n");
	for(int j=1;j<=n;++j){				//涂B前缀和
		x=0;
		for(int k=1;k<=m;++k){
			if(a[j][k]!='B')x++;
		}
		sumB[j]=sumB[j-1]+x;
//		printf("%d ",sumB[j]);
	}
//	printf("\n");
	for(int i=n;i>2;--i){              //涂R后缀和
		x=0;
		for(int j=1;j<=m;++j){
			if(a[i][j]!='R')x++;
		}
		sumR[i]=sumR[i+1]+x;
//		printf("%d ",sumR[i]);
	}
//	printf("\n");
	for(int i=2;i<n;++i){             //  i | i+1
		for(int j=i+1;j<=n;++j){         //  j | j+1
			x=sumW[i-1]+sumB[j-1]-sumB[i-1]+sumR[j];
			if(x<ans)ans=x;
//			printf("%d %d %d\n",i,j,x);
		}
	}
	printf("%d\n",ans);
	return 0;
}


/*
10 20
WBRWBBRWBBRBWBRWBWRB
BRWBWBRBWBRBWBRBWBWB
RBWBWWBWBRWRWBWRRBWR
WBWRWBRBWRWWRWRWBRWB
RWBWRWRWRWWRBWWBRWWR
WBRWBWBWRBRBRBWRWBRW
BRWRWBRWBWRRBWRWBRWW
BWRWRWRRRRRRRRRRRWWR
BBBBBBWRWBBWWRWRRWBW
BRWBRBWBRBWBRBWBRRWW


*/


2020/10/4 12:46
加载中...