CF-Codeforces Round #392 (Div. 2)-B-Blown Garland

来源:互联网 发布:美术生送什么礼物 知乎 编辑:程序博客网 时间:2024/05/18 01:20

ACM模版

描述

描述

题解

哎,第二次打 CF 就被第二题卡死了,不是难不难的问题,是真心英语差,忽略了(因为没看懂)一个极其重要的条件,结果想难了。

题目大意是给定一个串,串无论怎么分割,相邻的四个字母均不相同,当然,也只有这四个字母,!表示未知,我们需要知道这些感叹号都是什么字母,但是不需要知道准确的字母位置,只要知道这四个字母分别需要多少个才能把’!’替换完。

一开始将第二行最后一句理解错了,以为是每四盏灯至少有一个亮,于是我还怀疑起来样例有问题,后来直接忽视了这句话,毕竟我没有看懂。然后呢,我开始用一种极其笨重的做法,不断匹配字母,填补字母,考虑到了很多没有意义的东西。

然后,忽然感觉到,这个问题不是暴力匹配替换的问题,而应该是找规律的问题,于是乎,重新审视了第二段最后一句,理解到大意是每个字母至少出现一次……于是这就用到一个规律直接可以解出来,如果要保证每四个相邻的字母不同,那么第i个字母绝对和第i-4i+4个字母相同,如果存在的话。所以,同样是暴力解,只用暴力替换就行了,不用过多考虑匹配问题,之前就是考虑了很多匹配的问题,而忽略了规律。

当然,不得不说,我最开始出问题不光光是因为没有理解题意,而是自己没有静下心来观察问题的一般性规律,当知道规律时,根本用不到考虑匹配问题,直接暴力替换即可。

哎,我还是太渣了,一道简单的问题一时思路闭塞,没有找对方向,就一直坑下去了,还没有及时醒悟~/(ㄒoㄒ)/~~

代码

#include <iostream>#include <cstring>using namespace std;const int MAXN = 111;char S[MAXN];int kr, kb, ky, kg;void init(){    kr = kb = ky = kg = 0;}int main(int argc, const char * argv[]){    while (cin >> S)    {        init();        int len = (int)strlen(S);        while (true)        {            int flag = 0;            for (int i = 0; i < len; i++)            {                if (S[i] == '!')                {                    flag = 1;                    if (i > 3 && S[i - 4] != '!')                    {                        S[i] = S[i - 4];                        switch (S[i - 4])                        {                            case 'R':                                kr++;                                break;                            case 'B':                                kb++;                                break;                            case 'Y':                                ky++;                                break;                            case 'G':                                kg++;                                break;                        }                    }                    else if (i < len - 4 && S[i + 4] != '!')                    {                        S[i] = S[i + 4];                        switch (S[i + 4])                        {                            case 'R':                                kr++;                                break;                            case 'B':                                kb++;                                break;                            case 'Y':                                ky++;                                break;                            case 'G':                                kg++;                                break;                        }                    }                }            }            if (!flag)            {                break;            }        }        printf("%d %d %d %d\n", kr, kb, ky, kg);    }    return 0;}
0 0
原创粉丝点击