寒假訓練賽Ⅰ C題

C. Nice Garland

題目鏈接
題目大意:給出一個含有n個字符的字符串s,且都由R G B組成,題目要求你修改這個字符串,就是變換某位置上字符,要你求出最小修改次數,使滿足s[i]=s[i+3]。
思路:如果只有一個字符,那不用修改。如果只有兩個字符且相等,就修改一個。
如果大於等於3個字符,就枚舉六種情況RGB RBG BRG BGR GBR GRB六種爲頭的字符串,找出跟s對應位置上字符不同的個數,個數最小的那個就是結果。
代碼

#include <cstdio>
#include <cstring>
char s[200005],b[200005],res[200005];
char a[7][4]={"RBG","RGB","BGR","BRG","GBR","GRB"};
int compare(char a[],char b[],int len){
	int cnt=0;
	for(int i=0;i<len;i++){
		if(a[i]!=b[i]) cnt++;
	}
	return cnt;
}
int main(){
	int n,min=999999999;
	scanf("%d%s",&n,s);
	int len=strlen(s);
	if(len>=3)
	for(int i=0;i<6;i++){
		b[0]=a[i][0],b[1]=a[i][1],b[2]=a[i][2];
		for(int j=3;j<len;j++){
			b[j]=b[j-3];
		}
		int re=compare(b,s,len);
		if(re<min){
			min=re;
			res[0]=0;
			strcat(res,b);
		}
	}
	else{
		if(len==1) res[0]=s[0],min=0;
		else{
			if(s[0]==s[1]){
				if(s[0]=='R') s[1]='G';
				else if(s[0]=='G') s[1]='R';
				else if(s[0]=='B') s[1]='R';
			}
			strcat(res,s);
			min=1;
		}
	}
	printf("%d\n%s",min,res);
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章