HDU 1907 John nim博弈变形 Anti-SG

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=1907

题意:

nim博弈,不过取最后一次的人失败,输出获胜的那个人

思路:

AntiSG

  • AntiSG 游戏规定,决策集合为空的游戏者赢。
  • AntiSG 其他规则与 SG 游戏相同。

SJ
对于任意一个 AntiSG 游戏,如果我们规定当局面中所有的单一游戏的 SG 值为 0 时,游戏结束,则先手必胜当且仅当:

  1. 游戏的 SG 函 数不为 0 且游戏中某个单一游戏的 SG 函数大于 1
  2. 游戏的 SG 函数 为 0 且游戏中没有单一游戏的 SG 函数大于 1 <script type="math/tex" id="MathJax-Element-16">1</script>。

    设所有石子异或和为0时状态为T,不为0时状态为S,设只有一个石子的堆为孤单堆,否则为充裕堆。T状态下无充裕堆的状态记为T0,大于等于2个充裕堆的记为T2。根据上述定义可以定义S0,S1,S2。有结论如下:T0,S1,S2为必胜态,T2,S0为必输态。
    [定理1]:S0态,即仅有奇数个孤单堆,必败。T0态必胜。
    证明:S0态,其实就是每次只能取一根。每次第奇数根都由己取,第偶数根都由对方取,所以最后一根必己取。败。同理, T0态必胜
    [定理2]:S1态,只要方法正确,必胜。
    证明:若此时孤单堆堆数为奇数,把充裕堆取完;否则,取成一根。这样,就变成奇数个孤单堆,由对方取。由定理5,对方必输。己必胜
    [定理3]:S2态不可转一次变为T0态。
    证明:充裕堆数不可能一次由2变为0。得证
    [定理4]:S2态可一次转变为T2态。
    证明:由定理1,S态可转变为T态,态可一次转变为T态,又由定理6,S2态不可转一次变为T0态,所以转变的T态为T2态
    [定理5]:T2态,只能转变为S2态或S1态。
    证明:T态必然变为S态。由于充裕堆数不可能一次由2变为0,所以此时的T态不可能为S0态。命题得证。
    [定理6]:S2态,只要方法正确,必胜.
    证明:
    方法如下:
    1) S2态,就把它变为T2态
    2) 对方只能T2转变成S2态或S1态
    若转变为S2, 转向1)
    若转变为S1, 这己必胜。
    [定理7]:T2态必输。
    证明:同6。
    综上所述,必输态有: T2,S0 必胜态: S2,S1,T0.

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main()
    {
        int t, n, a;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d", &n);
            int ans = 0;
            bool flag = true;
            for(int i = 1; i <= n; i++)
            {
                scanf("%d", &a);
                if(a > 1) flag = false;
                ans ^= a;
            }
            if(flag) puts(ans ? "Brother" : "John");
            else puts(ans ? "John" : "Brother");
        }
        return 0;
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值