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

题目:传送门

题目大意:

   一道反nim游戏,即给出n堆石子,每次可以取完任意一堆或一堆中的若干个(至少取1),最后一个取的LOSE 

题解:

   一道很不错的题目啊,感觉可以作为一道很好的入门题

   读前一戳:博弈论文 && POPQQQ大佬%%%

   大体要分为三种情况来讨论:

   1、全是为1的石子堆,如有偶数堆则先手胜,反之后手胜

   2、有两堆相同的石子且都不为1(后手获胜的几率很大):
        那么如果先手将其中一堆取剩1,那么后手就可以将另一堆取完,此时后手胜

        如果先手将其中一堆取完,那么后手就可以将另一堆取剩1,还是后手胜

                如果先手仅拿走其中一堆的一部分,那么后手可以进行相同的操作,将另一堆也拿走相同的数量(这是情况又回到了上面两种)

   3、如果异或和不为0,那么对于一般的nim游戏一定可以将石子堆变成仅剩两堆相同的(平衡状态xor=0),这时又如上面所述了

  总结:

   如果全是石子数为1,异或和为0则先手胜,反之后手胜

   如果有不为1的,异或和不为0则先手胜,反之后手胜

代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int T,n;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);int x,ans=;bool flag=true;
for(int i=;i<=n;i++)
{
scanf("%d",&x);ans^=x;
if(x!=)flag=false;
}
if(flag==true)
{
if(ans==)printf("John\n");
else printf("Brother\n");
}
else
{
if(ans==)printf("Brother\n");
else printf("John\n");
}
}
return ;
}

最新文章

  1. Win7下VS2008破解方法
  2. macbook装双系统多分区其实很简单,你只要把macbook当作一台普通pc就可以了!
  3. ZooKeeper系列2:ZooKeeper的运行
  4. [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列
  5. SQL增加、删除、更改表中的字段名
  6. 导入安全证书到jdk步骤详细说明-原
  7. linux 学习网站
  8. iOS系统右滑返回全局控制方案
  9. 常用汇编命令&amp;&amp;OD命令总结
  10. iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
  11. Git命令详解(一)-个人使用
  12. [转]Traceroute网络排障实用指南(2)
  13. 记一次phpStudy apache启动后自动关闭 修改过程
  14. redis安装方法
  15. Java获得正则表达式
  16. UTF-8 GBK UTF8 GB2312 之间的区别和关系
  17. 使用xUnit为.net core程序进行单元测试(1)
  18. docker保存日志文件到本地
  19. Chapter 5 Blood Type——13
  20. Dev_GridView获取所选行的句柄

热门文章

  1. (LeetCode)二叉树中和为某一值的路径
  2. jQuery插件 -- Cookie插件
  3. 转换Arcgis Server REST接口实现OL2直接调用
  4. 2016.03.27,英语,《Vocabulary Builder》Unit 06
  5. UESTC--1272--Final Pan&#39;s prime numbers(水题)
  6. Python中functools模块函数解析
  7. QlikSense系列(1)——整体介绍
  8. 在64位linux上编译32位程序 for i386 intel
  9. surface 更新提示
  10. MyBatis数据持久化(十)与Spring4整合