SRM522 Div1 Easy(250), Div2 Medium(550) RowAndCoins

RowAndCoins

どちらかの端がAならばAliceが勝てる。

それ以外の場合はBobの勝ち。Aliceがどちらかの端を取るなら、Bobは他方の端1個を残せる。Aliceがどちらかの端を1個だけ残すならば、Bobはその1個を残せる。AliceがB…B○○○B…B、B…B○○○A…B、B…A○○○B……Bの形にすれば、BobはB…Bを残すことで、数学帰納法的にBobが勝てる。B…A○○○A…Bの形ならば、B…A○○○Bの形にして返せばよい。Aliceの手によらずB…A○○○Bもしくは、B…B○○Bの形にはできて、いつかは勝てる。

#include <string>
using namespace std;

class RowAndCoins{public:
string getWinner( string cells )
{
    if ( cells[0]=='A' || cells[cells.length()-1]=='A' )
        return "Alice";
    else
        return "Bob";
}};