Particle

競技プログラミングについての雑記

AOJ 0534: Chain

実装。色の変え方が最大で2パターンあるので、両方とも試す。

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

int n,chain[10000];

int fig(int b){
	int a = b-1,c = b+1,color,res = 0;
	if(a>=0){//b == 0のバターンを弾く
		int s = 1;
		color = chain[a];
		while(a>=0 && color==chain[a])a--,s++;
		while(c<n && color==chain[c])c++,s++;
		if(s>=4)while(a>=0 && c<n){
			int t = 0;
			color = chain[a];
			while(a>=0 && color==chain[a])a--,t++;
			while(c<n && color==chain[c])c++,t++;
			if(t>=4) s+=t;
			else break;
		}
		else s = 0;
		res = s;
		a = b-1;c = b+1;
	}
	if(c<n&&(a<0||chain[a]!=chain[c])){//b == n-1のパターンとchain[a] == chain[c]のパターンを弾く
		int s = 1;
		color = chain[c];
		while(a>=0 && color==chain[a])a--,s++;
		while(c<n && color==chain[c])c++,s++;
		if(s>=4)while(a>=0 && c<n){
			int t = 0;
			color = chain[a];
			while(a>=0 && color==chain[a])a--,t++;
			while(c<n && color==chain[c])c++,t++;
			if(t>=4) s+=t;
			else break;
		}
		else s = 0;
		res = max(res,s);
	}
	return res;
}

int main(){
	while(scanf("%d",&n),n){
		int del = 0;
		for(int i = 0; i < n; i++){
			scanf("%d",chain+i);
		}
		
		for(int i = 0; i < n; i++) del = max(del,fig(i));
		printf("%d\n",n-del);
	}
	return 0;
}