题目大意:
Stan和Ollie玩一个乘法游戏,Stan从1开始,每次对手都乘以2到9的一个数。给定n,谁第一次乘积大于等于n,谁赢
解题思路:
博弈问题。从N往1倒着计算。网上有个讲解不错,拿来用了
还是寻找必败点必胜点,不过在这个题目里转换成了寻找必败区间必胜区间的问题
以输入1000为例,我们可以倒着来,每个人除2到9之间的一个数
1000 | 999 … 112 | 若占住999到112,则对手必胜。 必须让对手占领此段。
1000 | 999 … 112 | 111 … 56 | 因此必占段是 111 -? 。如果56被对手占住,则56×2=112,入必败段。问题转化成为占56。
如此循环。如下 1000 | 999 … 112 | 111 … 56 | 55 … 7 | 6 … 4 | 3 … 1
| 必胜区间 |必败区间 | 胜 | 败 | 胜
到此,思路已经非常明显。
代码如下:
#include<stdio.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
while(n>18)
{
if(n%18==0) n=n/18;
else n=n/18+1;
}
if(n>9||n==1) printf("Ollie wins.\n");
else printf("Stan wins.\n");
}
return 0;
}