*[topcoder]LittleElephantAndBalls

http://community.topcoder.com/stat?c=problem_statement&pm=12758&rd=15704

topcoder的题经常需要找规律,而不是蛮干。比如这题,一开始又陷入思维定势,想DP,还是枚举,都不太好。但仔细观察,拿数据尝试后发现,其实最终就是把球分成两堆,来一个颜色c,如果左边有,就放右边,反之亦然;如果左右都有,放哪都一样。

基于这个算法,可以用set模拟,又或者直接计数就行了。

#include <string>

using namespace std;



class LittleElephantAndBalls {

public:

    int getNumber(string S);

};



int LittleElephantAndBalls::getNumber(string S) {

    int countRed = 0;

    int countGreen = 0;

    int countBlue = 0;

    int result = 0;

    for (int i = 0; i < S.length(); i++) {

        result += (countRed + countGreen + countBlue);

        if (S[i] == 'R')

            countRed = min(countRed+1, 2);

        if (S[i] == 'G')

            countGreen = min(countGreen+1, 2);

        if (S[i] == 'B')

            countBlue = min(countBlue+1, 2);

    }

    return result;

};

  

你可能感兴趣的:(topcoder)