zoj1893

题目大意:

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值