zoukankan      html  css  js  c++  java
  • POJ 2505 A multiplication game [博弈]

    题意:两个人做游戏,每个人都可以在自己的回合里将数p乘以2到9之间的一个数,初始时p=1,谁先将p乘到大于等于n就算赢。

    思路:一开始我算sg值,结果算来算去都没算明白。。。

    后来看了别人题解,才豁然开朗。

    首先,对于一个数m,计算出p在什么范围内可以乘到大于等于m。该范围即为[ceil(m/9), m - 1]。其中ceil()为向上取整。如果将每一个数字都看作一个局面的话,则在该区间内的点即为N点。

    对于一个数m,计算出p在什么范围内只能乘到大于等于m。该范围即为[ceil(m/2), m - 1]。如果将每一个数字都看作一个局面的话,且m对应的局面为N点时,则在该区间内的点即为P点。

    考虑到int类型取整的规则,将上述范围也可表示为[(m + 8) / 9, m - 1], [(m + 1) / 2, m - 1]。

     1 #include<stdio.h>
     2 int main()
     3 {
     4     int n;
     5     while (~scanf("%d", &n))
     6     {
     7         while (n)
     8         {
     9             n = (n + 8) / 9;//此时n为n点
    10             if (n == 1)
    11             {
    12                 printf("Stan wins.
    ");
    13                 break;
    14             }
    15             n = (n + 1) >> 1;//此时n为p点
    16             if (n == 1)
    17             {
    18                 printf("Ollie wins.
    ");
    19                 break;
    20             }
    21         }
    22     }
    23     return 0;
    24 }
  • 相关阅读:
    php类型转换
    PHP标记
    使用PHP从web访问mysql数据库
    javascript string对象的属性与方法
    linux vim 常用命令
    添加事件监听兼容IE6-8
    js-jQuery对象与dom对象相互转换
    js 数组
    js正则表达式
    选择排序
  • 原文地址:https://www.cnblogs.com/fenshen371/p/3287343.html
Copyright © 2011-2022 走看看