SRM554 Div1 Easy(250) TheBrickTowerEasyDivOne

TheBrickTowerEasyDivOne

同じ色が隣接しないという制約から、赤と青を交互に並べるしかない。

赤と青の高さと個数が等しいかどうかで場合分けする。高さが等しい場合はブロックの個数。等しくない場合、

(赤青)(赤青)(赤青)(␣青)

のように、2個ずつのグループに分けて考える。2個ずつのグループは1個以上赤青の最小値以下で、それぞれから、赤を取る、青を取る、そのままの3通りの長さが作れる。さらに、赤と青の個数が異なるならば、最後に多い方を付け加えることができる。

#include <algorithm>
using namespace std;

class TheBrickTowerEasyDivOne{public:
int find( int redCount, int redHeight, int blueCount, int blueHeight )
{
    if ( redHeight==blueHeight )
        if ( redCount==blueCount )
            return min(redCount,blueCount)*2;
        else
            return min(redCount,blueCount)*2+1;
    else
        if ( redCount==blueCount )
            return min(redCount,blueCount)*3;
        else
            return min(redCount,blueCount)*3+1;
}};