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);
}