一道cf水题

题意:输入数字n表示字符串中元素个数,字符串中只含有RGB三个字符,现在要求任意两个相同的字符他们的下标之差能整除3。

思路:任意两个相同的字符的下标能整除3,也就是任意三个为一组的字符串当中的字符不能相同,那么只要某一组字符确定了,那么字符串中所有字符也就确定了,我们不妨来枚举前三个字符可能的排列,只要第一组确定了,后面也就全部确定了(当时自己去字符串里面找第一个不重复的三个字符组不就是这个意思么)。接下来第一组确定后,由于后面所有的字符都和它相同,所以我们只需要遍历一遍统计后面与他不对应的字符个数就可以了。接下来我们把第一组换成别的字符串,比如BRG换成BGR然后在统计不相同的字符个数,最后在取最小的数值就是答案了。下面上代码

#include <bits/stdc++.h>
#define maxn 1000006
using namespace std;
char a[]="BGR";
string s,str;
int main()
{
    int n;
    int cnt=0;
    cin>>n;
    cin>>s;
    int minn=0x3f3f3f;
    do
    {
       cnt=0;
       for(int i=0;i<n;i++)
        if(s[i]!=a[i%3])
        cnt++;
        if(cnt<minn)
        {
            minn=cnt;
            for(int i=0;i<3;i++)
            str[i]=a[i];
        }
    }while(next_permutation(a,a+3));

    cout<<minn<<"
";
    for(int i=0;i<n;i++)
        cout<<str[i%3];
    return 0;
}
原文地址:https://www.cnblogs.com/rainyskywx/p/10322324.html