This solution gets "Wrong answer" result inhttp://www.programming-challenges.com/,
but it gets "Accepted" result inhttp://uva.onlinejudge.org/.
I don't know why so far.
#include <math.h>
#include <iostream>
using namespace std;
#define MIN 2.0
#define MAX 9.0
enum Result_t
{
STAN,
OLLIE
};
enum Target_t
{
NOT_LESS_THAN_AND_FIND_WINNER,
LESS_THAN_AND_FIND_LOSER
};
static void OutputResult(Result_t result)
{
switch(result)
{
case STAN:
cout << "Stan";
break;
default:
cout << "Ollie";
}
cout << " wins." << endl;
}
static Result_t GetOppositeResult(Result_t result)
{
switch(result)
{
case STAN:
return OLLIE;
default:
return STAN;
}
}
static Result_t RunGame(unsigned long long n, Target_t target)
{
if (NOT_LESS_THAN_AND_FIND_WINNER == target)
{
// Find Winner.
if (n <= 9)
return STAN;
if ((9 < n) && (n < (9 * 2)))
return OLLIE;
if (((2 * 2 * 9) <= n) && (n < (9 * 9 * 2)))
return STAN;
return GetOppositeResult(RunGame(ceil((double)n / MAX), LESS_THAN_AND_FIND_LOSER));
}
else // if (LESS_THAN_AND_FIND_LOSER == target)
{
// Find Loser
if (n <= 2)
return STAN;
if ((2 < n) && (n < (9 * 2)))
return OLLIE;
return GetOppositeResult(RunGame(ceil((double)n / MIN), NOT_LESS_THAN_AND_FIND_WINNER));
}
}
static void Test()
{
unsigned long long n;
while(cin >> n)
OutputResult(RunGame(n, NOT_LESS_THAN_AND_FIND_WINNER));
}
int main(int argc, char* argv[])
{
Test();
return 0;
}