poj2505

博弈

题意:两个人轮流用2~9来乘n,使n不断扩大,n开始为1。当给一个固定值k,谁先使n超过k谁赢。

分析:能到达必败态的状态为必胜态,只能到达必胜态的状态为必败态。对于给定的k,n>=k时为必败态,所有能到达这些必败态的n为必胜态,这些必胜态中最小的是ceil(k/9.0)。凡是大于它的都可以直接到达必败态。然而有些状态只能到达必胜态,就是那些乘二都要进入必胜态的数字,这些数中最小的是ceil(ceil(k/9.0)/2.0)。这样我们又得到了一批必败态,我们只要按照这种方法不断地由必败推必胜,由必胜推必败,即可知道1是必败还是必胜。也就知道了stan是赢还是输了。

View Code
#include <iostream>
#include
<cstdlib>
#include
<cstring>
#include
<cstdio>
#include
<cmath>
using namespace std;

int main()
{
//freopen("t.txt", "r", stdin);
long long n;
while (scanf("%I64d", &n) != EOF)
{
while (true)
{
n
= ceil(n / 9.0);
if (n == 1)
{
printf(
"Stan wins.\n");
break;
}
n
= ceil(n / 2.0);
if (n == 1)
{
printf(
"Ollie wins.\n");
break;
}
}
}
return 0;
}

你可能感兴趣的:(poj)