*[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;
};

  

posted @ 2013-11-28 21:08  阿牧遥  阅读(230)  评论(0编辑  收藏  举报