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 }
  • 相关阅读:
    监控里的主码流和子码流是什么意思
    监控硬盘容量计算
    一个能让你了解所有函数调用顺序的Android库
    电工选线
    oracle linux dtrace
    list all of the Oracle 12c hidden undocumented parameters
    Oracle Extended Tracing
    window 驱动开发
    win7 x64 dtrace
    How to Use Dtrace Tracing Ruby Executing
  • 原文地址:https://www.cnblogs.com/fenshen371/p/3287343.html
Copyright © 2011-2022 走看看