codeforces 1108D - Diverse Garland C语言 贪心

题目不贴了,这个题目是我预面试时老师出的三道编程题之一。很遗憾,当时没接触过贪心算法。没有做出来。耿耿于怀啊,老师说这几道题目都很简单,现在看来确实是贪心中比较简单的了。回到题目本身,你会发现所有重复的字母,你只需考虑第一个字母,和最后一个不重复的字母,比如字符串是RRRGBRBG,重复的字母是R,与RRR挨着的是字符G,我们只需要将字符串RRR中第二个字符开始,都改成B,更复杂的也是如此。代码附上

int main()
{
    char str[200005];
    int n;
    scanf("%d",&n);
    scanf("%s", str);
    int i, j, len, count;
    count = 0;
    len = n;
    for (i = 0; i < len-1;)
    {
        if (str[i] != str[i + 1])
        {
            i++;
            continue;
        }
        else
        {
            j = i + 1;
            while (str[i] == str[j] && j < len)
                j++;
            if (j == len)
            {
                switch (str[i])
                {
                    case'R':
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'G';
                            count++;
                        }
                        break;
                    case'G':
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'B';
                            count++;
                        }
                        break;
                    case'B':
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'R';
                            count++;
                        }
                        break;
                }
            }
            else
            {
                switch (str[i])
                {
                case 'R':
                    if (str[j] == 'G')
                    {
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'B';
                            count++;
                        }
                    }
                    else if (str[j] == 'B')
                    {
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'G';
                            count++;
                        }
                    }
                    break;
                case 'G':
                    if (str[j] == 'B')
                    {
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'R';
                            count++;
                        }
                    }
                    else if (str[j] == 'R')
                    {
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'B';
                            count++;
                        }
                    }
                    break;
                case 'B':
                    if (str[j] == 'R')
                    {
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'G';
                            count++;
                        }
                    }
                    else if (str[j] == 'G')
                    {
                        for (i = i + 1; i < j; i = i + 2)
                        {
                            str[i] = 'R';
                            count++;
                        }
                    }
                    break;

                }
                i = j;
            }
        }
    }
    printf("%d\n", count);
    printf("%s", str);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_37372543/article/details/89051668