zoukankan      html  css  js  c++  java
  • BZOJ 1022(博弈论)

    传送门

    题面:

    1022: [SHOI2008]小约翰的游戏John

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 3445  Solved: 2222
    [Submit][Status][Discuss]

    Description

      小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取
    的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取,我们规定取到最后一
    粒石子的人算输。小约翰相当固执,他坚持认为先取的人有很大的优势,所以他总是先取石子,而他的哥哥就聪明
    多了,他从来没有在游戏中犯过错误。小约翰一怒之前请你来做他的参谋。自然,你应该先写一个程序,预测一下
    谁将获得游戏的胜利。

    Input

      本题的输入由多组数据组成第一行包括一个整数T,表示输入总共有T组数据(T≤500)。每组数据的第一行包
    括一个整数N(N≤50),表示共有N堆石子,接下来有N个不超过5000的整数,分别表示每堆石子的数目。

    Output

      每组数据的输出占一行,每行输出一个单词。如果约翰能赢得比赛,则输出“John”,否则输出“Brother”
    ,请注意单词的大小写。

    Sample Input

    2
    3
    3 5 1
    1
    1

    Sample Output

    John
    Brother

    题目分析:

        SG博弈第一题?!第一眼看过去貌似是个Nim博弈?!写了一发果断wa......


        实际这是一个经典的Anti-SG游戏的模型。

        Anti-SG游戏即为满足下列条件的博弈:

            1、决策集合为空的操作者胜。
            2、其余规则与SG游戏一致。

        对于Anti-SG游戏,我们可以通过SJ定理进行解决:

        SJ定理

            对于任意一个Anti-SG游戏,如果定义所有子游戏的SG值为0时游戏结束,先手必胜的条件:
            1、游戏的SG值为0且所有子游戏SG值均不超过1。
            2、游戏的SG值不为0且至少一个子游戏SG值超过1。

        证明:

             我不会证明,借鉴一下大佬的证明。


    代码:

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    bool check(){
        int SG=0;
        bool flag=false;
        for(int i=0;i<n;i++){
            int num;
            scanf("%d",&num);
            if(num!=1) flag=true;
            SG^=num;
        }
        if((SG!=0&&flag)||(SG==0&&!flag)) return true;//通过SJ定理进行判断
        else return false;
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            if(check()) puts("John");
            else puts("Brother");
        }
    }
    

       

  • 相关阅读:
    python 包管理工具 pip 的配置
    Python 变量作用域 LEGB (下)—— Enclosing function locals
    Python 变量作用域 LEGB (上)—— Local,Global,Builtin
    2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)
    mysql 根据日期(date)做年,月,日分组统计查询
    jvm指令
    正则表达式 分割地址 获取省市区详细地址
    .Net 异常记录
    WCF设计服务协议(一)
    plsql ORA-01789:查询块具有不正确的结果列数
  • 原文地址:https://www.cnblogs.com/Chen-Jr/p/11007179.html
Copyright © 2011-2022 走看看