Problem:
ロシアの旗 (Russian Flag)
問題
K 理事長はロシアで開催される IOI 2016 に合わせて旗を作ることにした．K 理事長はまず倉庫から古い旗を取り出してきた．この旗は N 行 M 列のマス目に分けられていて，それぞれのマスには白・青・赤のいずれかの色が塗られている．
K 理事長はこの旗のいくつかのマスを塗り替えて
ロシアの旗
にしようとしている．ただし，この問題でいうロシアの旗とは以下のようなものである．
上から何行か (1 行以上) のマスが全て白で塗られている．
続く何行か (1 行以上) のマスが全て青で塗られている．
それ以外の行 (1 行以上) のマスが全て赤で塗られている．
K 理事長が古い旗をロシアの旗にするために塗り替える必要のあるマスの個数の最小値を求めよ．
入力
入力は 1 + N 行からなる．
1 行目には，2 つの整数 N, M (3 ≦ N ≦ 50, 3 ≦ M ≦ 50) が空白を区切りとして書かれている．これは，旗が N 行 M 列のマス目に区切られていることを表す．
続く N 行にはそれぞれ M 文字からなる文字列が書かれており，古い旗のマス目に塗られている色の情報を表す．N 行のうちの i 行目の j 文字目 (1 ≦ i ≦ N, 1 ≦ j ≦ M) は，古い旗のマス目の i 行目 j 列目のマスの色を表す 'W', 'B', 'R' のいずれかの文字である．
'W' は白，'B' は青，'R' は赤を表す．
出力
K 理事長が古い旗をロシアの旗にするために塗り替える必要のあるマスの個数の最小値を 1 行で出力せよ．
入出力例
入力例 1
4 5
WRWRW
BWRWB
WRWRW
RWBWR
出力例 1
11
入力例 2
6 14
WWWWWWWWWWWWWW
WBBBWWRRWWBBBW
WWBWWRRRRWWBWW
BWBWWRRRRWWBWW
WBBWWWRRWWBBBW
WWWWWWWWWWWWWW
出力例 2
44
入出力例 1 において，古い旗には下図のように色が塗られている．
下図において，'X' の書かれた 11 個のマスを塗り替える．
これにより下図のようなロシアの旗にすることができる．
11 個未満のマスを塗り替えることではロシアの旗にすることはできないため，11 を出力する．
入出力例 2 においては，古い旗には下図のように色が塗られている．
情報オリンピック日本委員会作 『第 15 回日本情報オリンピック JOI 2015/2016 予選競技課題』

Submitted solutions:

code_snippet: #include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int N, M;

int main() {
  cin >> N >> M;
  vector<string> board(N);

  for(int i=0; i<N; i++) {
    cin >> board[i];
  }

  int ans = N*M;
  for(int r=1; r<=N-2; r++) {
    for(int b=1; b<=N-2; b++) {
      for(int w=1; w<=N-2; w++) {
        if(r + b + w != N) continue;
        vector<string> comp(N);
        int idx = 0;

        for(int i=0; i<w; i++) {
          comp[idx++] = string(M, 'W');
        }
        for(int i=0; i<b; i++) {
          comp[idx++] = string(M, 'B');
        }
        for(int i=0; i<r; i++) {
          comp[idx++] = string(M, 'R');
        }

        int cnt = 0;
        for(int i=0; i<N; i++) {
          for(int j=0; j<M; j++) {
            cnt += (board[i][j] != comp[i][j]);
          }
        }
        ans = min(ans, cnt);
      }
    }
  }
  cout << ans << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3188
final_rank: 3

code_snippet: # include <iostream>
# include <algorithm>
# include <vector>
# include <string>
# include <set>
# include <map>
# include <cmath>
# include <iomanip>
# include <functional>
# include <utility>
# include <stack>
# include <queue>
# include <list>
# include <tuple>
# include <unordered_map>
# include <numeric>
# include <complex>
using namespace std;
using LL = long long;
using ULL = unsigned long long;
constexpr int INF = 2000000000;
constexpr int HINF = INF / 2;
constexpr double DINF = 100000000000000000.0;
constexpr long long LINF = 9223372036854775807;
constexpr long long HLINF = 4500000000000000000;
const double PI = acos(-1);
int dx[4] = { 0,1,0,-1 }, dy[4] = { 1,0,-1,0 };
# define ALL(x)    (x).begin(),(x).end()
# define UNIQ(c)   (c).erase(unique(ALL((c))), end((c)))
# define mp        make_pair
# define eb        emplace_back
# define REP(i, a) for (int i = 0; i < (a); i++)
# define INIT      std::ios::sync_with_stdio(false);std::cin.tie(0);


int main() {
	int n, m;
	cin >> n >> m;
	vector<string> vec;
	for (int i = 0; i<n; i++) {
		string t;
		cin >> t;
		vec.push_back(t);
	}
	int ans = INF;
	for (int i = 1; i<n; i++) {
		for (int j = 1; i + j<n; j++) {
			for (int k = 1; i + j + k <= n; k++) {
				int sum = 0;
				for (int l = 0; l<n; l++) {
					for (int p = 0; p<m; p++) {
						if (l<i&&vec[l][p] != 'W') {
							sum++;
						}
						else if (i <= l&&l<i + j&&vec[l][p] != 'B') {
							sum++;
						}
						else if (i + j <= l&&vec[l][p] != 'R') {
							sum++;
						}
					}
				}
				ans = min(ans, sum);
			}
		}
	}
	cout << ans << endl;
}
accuracy: 1
time_ms: 70
memory_kb: 3160
final_rank: 5

code_snippet: #include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int n, m;
vector<string> a;
int ans = 100100100;

int main(){
	scanf("%d %d", &n, &m);
	for(int i=0; i<n; i++){
		char t[m+1];
		scanf("%s", t);
		a.push_back(t);
	}

	for(int i=0; i<n-2; i++){
		for(int j=1; i+j<n-1; j++){
			for(int k=1; i+j+k<n; k++){
				int t = 0;
				for(int ii=0; ii<n; ii++){
					char s[2];
					if(ii <= i) s[0] = 'W';
					else if(ii <= i+j) s[0] = 'B';
					else s[0] = 'R';
					for(int jj=0; jj<m; jj++){
						if(a[ii][jj] != s[0]) t++;
					}
				}
				ans = min(ans, t);
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}
accuracy: 1
time_ms: 70
memory_kb: 2836
final_rank: 2

code_snippet: #include <cstdio>
#include <algorithm>
using namespace std;

int X, Y;
char flag[50][51];
int answer;
int sit[50][3];

inline int russia(char x){
	if (x == 'B')return 0;
	if (x == 'W')return 1;
	if (x == 'R')return 2;

}

int f(int x,int color){
	if (x == 0)return sit[0][0] + sit[0][2];
	if (x == Y - 1)return min(f(x - 1, 0), f(x - 1, 2)) + sit[x][0] + sit[x][1];
	if (color == 0)return min(f(x - 1, 0), f(x - 1, 1)) + sit[x][1] + sit[x][2];
	if (color == 1)return min(f(x - 1, 2), f(x - 1, 1)) + sit[x][2] + sit[x][0];
	if (color == 2)return min(f(x - 1, 2), f(x - 1, 0)) + sit[x][1] + sit[x][0];

	return 1000000;
}

int main(){
	scanf("%d %d", &Y, &X);
	for (int i = 0; i < Y; ++i){
		scanf("%s", &(flag[i]),X);
		for (int x = 0; x < X; ++x){
			sit[i][russia(flag[i][x])] += 1;
		}
	}
	printf("%d\n", f(Y - 1, 2));


	return  0;
}
accuracy: 0.2
time_ms: 1810
memory_kb: 2684
final_rank: 6

code_snippet: #include <iostream>
#include <string>
#include <algorithm>

using namespace std;

#define FOR(i,a,b) for(int i = (a); i < (b); i++)
#define REP(i,n) FOR(i,0,n)
#define INF (1<<29)

int main() {
	int n, m;
	cin >> n >> m;
	string maps[50];
	REP(i, n) cin >> maps[i];
	
	int ans = INF;
	FOR(w, 1, n + 1) FOR(b, 1, n - w + 1) FOR(r, 1, n - w - b + 1) {
		int cnt = 0;
		FOR(i, 0, w) cnt += m - count(maps[i].c_str(), maps[i].c_str() + maps[i].size(), 'W');
		FOR(i, w, w + b) cnt += m - count(maps[i].c_str(), maps[i].c_str() + maps[i].size(), 'B');
		FOR(i, w + b, n) cnt += m - count(maps[i].c_str(), maps[i].c_str() + maps[i].size(), 'R');
		
		ans = min(ans, cnt);
	}
	
	cout << ans << endl;
	
	return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 3176
final_rank: 4

code_snippet: #include <bits/stdc++.h>
using namespace std;

int main() {
  int n,m;
  cin >> n >> m;
  string s[n];
  for(int i=0; i<n; i++) cin >> s[i];
  int ans=n*m;
  for(int x=1; x<n; x++) {
    for(int y=x+1; y<n; y++) {
      int cnt=0;
      for(int i=0; i<n; i++) {
        for(int j=0; j<m; j++) {
          if(i<x&&s[i][j]!='W') cnt++;
          if(i>=x&&i<y&&s[i][j]!='B') cnt++;
          if(i>=y&&s[i][j]!='R') cnt++;
        }
      }
      ans=min(ans,cnt);
    }
  }
  cout << ans << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1208
final_rank: 1