题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1022

(luogu) https://www.luogu.org/problemnew/show/P4279

题解:

大力出奇迹系列。。

我找了一小时规律,瞎猜了一个结论,看着都不靠谱,结果它居然过了。。。。

结论: 若所有\(a_i\)都等于\(1\), 则后手必胜当且仅当\(n\)是奇数;否则后手必胜当且仅当所有\(a_i\)异或和为\(0\).

既然对了那就口胡一个证明:

(1) 当所有\(a_i\)都为\(1\)时,后手必胜当且仅当\(n\)是奇数,显然。

(2) 否则,如果大于\(1\)的数恰好有\(1\)个,那么如果\(n\)是奇数,则把大于\(1\)这一堆拿成\(1\), 否则把大于\(1\)这一堆拿成\(0\)即可,因此先手必胜。

(3) 如果大于\(1\)的数多于\(1\)个呢?我们发现第(2)种情况的结论符合Nim游戏的一般结论(后手必胜当且仅当异或和为\(0\)),而对于任何一个大于\(1\)的数恰好有\(1\)个的状态,不可能一步变成所有数都等于\(1\), 因此情况(1)不会影响到情况(3)。故大于\(1\)的数多于一个时,依然符合Nim游戏的一般结论。

记住,博弈论千万不要死抓着SG函数不放!胜负分析才是最本质的,另外有时候需要转化模型(如AGC002E).

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
using namespace std; inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
} int n; int main()
{
int T; scanf("%d",&T);
while(T--)
{
int n; scanf("%d",&n);
int x=0,c=0;
for(int i=1; i<=n; i++) {int a; scanf("%d",&a); x^=a; c+=(a==1)?1:0;}
if(c==n)
{
if(n&1) printf("Brother\n"); else printf("John\n");
}
else
{
if(x==0) printf("Brother\n"); else printf("John\n");
}
}
return 0;
}

BZOJ 1022 Luogu P4279 [SHOI2008]小约翰的游戏 (博弈论)的更多相关文章

  1. 洛谷 P4279 [SHOI2008]小约翰的游戏 解题报告

    P4279 [SHOI2008]小约翰的游戏 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有\(n\)堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子 ...

  2. P4279 [SHOI2008]小约翰的游戏(Anti_nim)

    Link 题面 题目描述 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有 \(n\) 堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子, 在这堆石子中取走任意多的石子,但不 ...

  3. P4279 [SHOI2008]小约翰的游戏

    嘟嘟嘟 一道博弈论经典题,nim游戏. 只不过要考虑有奇数个石子为1的堆的时候,为Brother赢.剩下就是nim游戏了. 极简代码 #include<cstdio> using name ...

  4. bzoj 1022: [SHOI2008]小约翰的游戏John anti_nim游戏

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1189  Solved: 734[Submit][ ...

  5. BZOJ 1022 [SHOI2008]小约翰的游戏John

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1635  Solved: 1036[Submit] ...

  6. BZOJ 1022 [SHOI2008]小约翰的游戏John AntiNim游戏

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1475  Solved: 932[Submit][ ...

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

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1322  Solved: 829[Submit][ ...

  8. 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2709  Solved: 1726[Submit] ...

  9. bzoj千题计划112:bzoj1022: [SHOI2008]小约翰的游戏John

    http://www.lydsy.com/JudgeOnline/problem.php?id=1022 http://www.cnblogs.com/TheRoadToTheGold/p/67448 ...

随机推荐

  1. [转帖]VMWare官网:无法关闭 ESXi 主机上的虚拟机 (1014165)

    无法关闭 ESXi 主机上的虚拟机 (1014165) https://kb.vmware.com/s/article/1014165?lang=zh_CN Last Updated: 4/17/20 ...

  2. springcloud用法

    springcloud用法 使用springcloud搭建微服务肯定要在父工程下面编写子工程 一.搭建eureka注册中心 1.    创建maven项目(在springboot项目下建立子工程eur ...

  3. 洛谷 P2647 最大收益 题解

    题面 对于“n个物品选任意个”我们就可以想到一种递推方法,即设f[i][j]表示前i个物品选j个的最大收益 我们发现正着转移并不好转移,我们可以倒着转移,使选择的当前第i号物品为第一个物品,这样的话我 ...

  4. reload() 方法用于重新加载当前文档。配合Ajax异步请求。

    1. reload() 方法, reload() 方法用于重新加载当前文档.配合Ajax异步请求. http://www.w3school.com.cn/jsref/met_loc_reload.as ...

  5. javaweb:关于HttpServletResponse介绍 (转)

    出处: https://www.cnblogs.com/xdp-gacl/p/3789624.html Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request ...

  6. thinkphp5 安装

    thinkphp 5开始可以使用composer安装 所以在安装thinkphp5.1之前,我们先安装composer ,下载地址:https://www.phpcomposer.com/ 安装完co ...

  7. 在线修改大表结构pt-online-schema-change

    使用场景 在线数据库的维护中,总会涉及到研发修改表结构的情况,修改一些小表影响很小,而修改大表时,往往影响业务的正常运转,如表数据量超过500W,1000W,甚至过亿时 在线修改大表的可能影响 在线修 ...

  8. 阿里云CentOs服务器 安装与配置mysql数据库

    阿里云CentOs服务器 安装与配置mysql数据库 以上为Linux安装mysql数据库 Linux 安装mysql 数据库 一下为mysql 安装教程 Using username "r ...

  9. linux c 链接详解3-静态库

    3静态库 摘自:Linux C编程一站式学习 透过本节可以学会编译静态链接库的shell脚本! 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库,我们在不同的程 ...

  10. 一个线程oom,进程里其他线程还能运行吗?

    线程之间互相不影响:守护线程生活周期相同 引言 这题是一个网友@大脸猫爱吃鱼给我的提问,出自今年校招美团三面的一个真题.大致如下 一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么? ...