hdu 1517 A Multiplication Game(博弈找规律)

1  2-----9 、  (9+1) ------- (2*9)、(2*9+1) ------- (2*9*9) 、(2*9*9+1) ------ (2*9*9*2)、(2*9*9*2+1) ------(2*9*9*2*9) ......

     N                          P                                  N                                      P                                           N

      S                         O                                 S                                      O                                           S

     *9                        *2                                 *9                                      *2                                          *9


P为必败点(下一个选手获胜),N为必胜点(上一个选手获胜)。

这里P、N的划分:

   一段N点的最后 *2 是因为P点无论哪种方案到达N点,例如点2*9,就是最后一个可由2乘以9得到的数,一旦大于2*9,则由点2就绝对不能通过乘以2----9的某个数达到(不能满足P的属性)。

   一段P点的最后 *9 是因为N点至少有一种方案到达P点,例如 2*9*9 ,只有2*9通过乘以9得到满足条件的数,一旦大于 2*9*9 ,则所有前一个N段中的数都不能通过乘以2-----9的某个数得到满足条件的数,即>=2*9*9+x (x>0)。(不能满足N的属性)

所以,以每段最后一个数作为判断标准。

代码:

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n>=1 && n<=9) {printf("Stan wins.\n"); continue;}
        bool flag=true;
        int temp=1;
        while(temp<n)
        {
            if(flag)
            {
                temp*=9;
                flag=false;
            }
            else 
            {
                temp*=2;
                flag=true;
            }
        }
        if(flag) printf("Ollie wins.\n");
        else  printf("Stan wins.\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值