zoukankan      html  css  js  c++  java
  • HDU 1907 Nim博弈变形

    1、HDU 1907  

    2、题意:n堆糖,两人轮流,每次从任意一堆中至少取一个,最后取光者输

    3、总结:有点变形的Nim,还是不太明白,盗用一下学长的分析吧 传送门 

    分析:经典的Nim博弈的一点变形。设糖果数为1的叫孤独堆,糖果数大于1的叫充裕堆,设状态S0:a1^a2^..an!=0&&充裕堆=0,则先手必败(奇数个为1的堆,先手必败)。S1:充裕堆=1,则先手必胜(若剩下的n-1个孤独堆个数为奇数个,那么将那个充裕堆全部拿掉,否则将那个充裕堆拿得只剩一个,这样的话先手必胜)。T0:a1^a2^..an=0&&充裕堆=0,先手必胜(只有偶数个孤独堆,先手必胜)。S2:a1^a2^..an!=0&&充裕堆>=2。T2:a1^a2^..an=0&&充裕堆>=2。这样的话我们用S0,S1,S2,T0,T2将所有状态全部表示出来了,并且S0先手必败,S1、T0先手必胜,那么我们只需要对S2和T2的状态进行分析就行了。(a)S2可以取一次变为T2。(b)T2取一次可变为S2或者S1。因为S1是先手必胜态,那么根据a,b这两个转换规则,我们就能得知S2也是先手必胜,T2是先手必败。

    #include<bits/stdc++.h>
    #define F(i,a,b) for (int i=a;i<b;i++)
    #define FF(i,a,b) for (int i=a;i<=b;i++)
    #define mes(a,b) memset(a,b,sizeof(a))
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long LL;
    const int N=10010;
    
    int main()
    {
        int T,n,a[100];
        scanf("%d",&T);
        while(T--) {
            scanf("%d",&n);
            int ans=0,flag=0;
            F(i,0,n) {
                scanf("%d",&a[i]);
                ans^=a[i];
                if(a[i]!=1) flag=1;     //全部为1就要特判
            }
            if(flag) {
                if(!ans) puts("Brother");
                else puts("John");
            } else {
                if(ans^1==1) puts("John");
                else puts("Brother");
            }
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    转:testlink 环境搭建(傻瓜版)
    转最简便安装python+selenium-webdriver环境方法
    转发 python中file和open有什么区别
    一面cvte
    org.apache.hadoop.security.AccessControlException: Permission denied:
    让hadoop-0.20.2自带的eclipse插件支持eclipse-3.5以上
    在VMWare中建立Hadoop虚拟集群的详细步骤(使用CentOS)
    第一天
    执行insmod提示invalidmodule format
    Linux Kernel中函数命名
  • 原文地址:https://www.cnblogs.com/sbfhy/p/6031405.html
Copyright © 2011-2022 走看看