zoukankan      html  css  js  c++  java
  • [博弈]受限Nim游戏

    题目大意:有N(1<=N<=100)堆石子,每堆个数给定A1..AN(1<=Ai<=2,147,483,647),现有甲乙两人轮流取石子,由甲开始,每次选一堆,取走一定数目石子,1到Ai的一半取下整,如Ai=5时,可取1或2,Ai=6时,可取1或2或3,但Ai=1不能取。不能取者负,求甲是否获胜。假定每人都采取最优策略。

    这是我第一道用sg来做的题目,先贴一个链接,此人对sg的介绍非常好,至少我一遍看懂了,非常感谢。http://blog.163.com/scuqifuguang@126/blog/static/171370086201101711276278/

    在说这道题吧,我们可以非常容易地写出sg函数表达式,sg(i)=mex{sg(i-k)} ∈(1,i/2),然后我通过程序发现了一个规律,对于一个数x,它的sg函数值即为

    f(x)/2,其中f(x)为x不停地除以2直到它为偶数为止。代码挺短的,贴一个。

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 long long  ans=0;
     5 int T;
     6 int n;
     7 int main()
     8 {
     9     scanf("%d",&T);
    10     while(T--)
    11     {
    12         scanf("%d",&n);
    13         ans=0;
    14         for(int i=1;i<=n;i++)
    15         {
    16             long  long x;
    17             scanf("%I64d",&x);
    18             while(x&1)x/=2;
    19             x/=2;
    20             ans^=x;
    21         }
    22         if(ans)puts("Win");else puts("Lose");
    23     }
    24     return 0;
    25 }
    26             
    View Code
  • 相关阅读:
    TODO 模板实践
    C++类继承方式及实践
    【转】C++友元
    C++面向对象实践
    数组指针实践
    引用&指针交换函数实践
    左值引用&右值引用实践【TODO】
    const变量的修改实践
    【转】c语言动态与静态分配
    【转】数组指针&指针数组
  • 原文地址:https://www.cnblogs.com/sillygirl/p/3916550.html
Copyright © 2011-2022 走看看