博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1022(博弈论)
阅读量:4684 次
发布时间:2019-06-09

本文共 1007 字,大约阅读时间需要 3 分钟。

题面:

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

Time Limit: 1 Sec  Memory Limit: 162 MB

Submit: 3445  Solved: 2222
[][][]

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 
using namespace std;int n;bool check(){ int SG=0; bool flag=false; for(int i=0;i

   

转载于:https://www.cnblogs.com/Chen-Jr/p/11007179.html

你可能感兴趣的文章
【课程12】循环嵌套和算法
查看>>
设计模式——外观模式
查看>>
mongodb 脚本操作
查看>>
基本运算符
查看>>
在MAC OS 下配置python + Flask ,并支持pyCharm编辑器
查看>>
解决:Invalid character found in method name. HTTP method names must be tokens
查看>>
Cracking the coding interview--Q1.8
查看>>
用c++写一个广告系统
查看>>
Atom编辑器入门到精通(一) 安装及使用基础
查看>>
jQuery插件开发(转)
查看>>
java中volatile不能保证线程安全
查看>>
Oracle左连接、右连接、全外连接以及(+)号用法
查看>>
追加内容到指定的行
查看>>
编写高质量代码改善C#程序的157个建议——建议108:将类型标识为sealed
查看>>
sql常识-Join
查看>>
sqlplus连接远程数据库
查看>>
利用mask layer 勾View
查看>>
数据科学初学者九种常见错误
查看>>
SAS数据挖掘实战篇【一】
查看>>
SAS市场研究应用介绍:组合/联合分析
查看>>