bzoj1022: [SHOI2008]小约翰的游戏John(博弈SG-nim游戏)
2024-10-15 12:27:20
1022: [SHOI2008]小约翰的游戏John
题目:传送门
题目大意:
一道反nim游戏,即给出n堆石子,每次可以取完任意一堆或一堆中的若干个(至少取1),最后一个取的LOSE
题解:
一道很不错的题目啊,感觉可以作为一道很好的入门题
大体要分为三种情况来讨论:
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 ;
}
最新文章
- Win7下VS2008破解方法
- macbook装双系统多分区其实很简单,你只要把macbook当作一台普通pc就可以了!
- ZooKeeper系列2:ZooKeeper的运行
- [CareerCup] 3.5 Implement Queue using Two Stacks 使用两个栈来实现队列
- SQL增加、删除、更改表中的字段名
- 导入安全证书到jdk步骤详细说明-原
- linux 学习网站
- iOS系统右滑返回全局控制方案
- 常用汇编命令&;&;OD命令总结
- iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
- Git命令详解(一)-个人使用
- [转]Traceroute网络排障实用指南(2)
- 记一次phpStudy apache启动后自动关闭 修改过程
- redis安装方法
- Java获得正则表达式
- UTF-8 GBK UTF8 GB2312 之间的区别和关系
- 使用xUnit为.net core程序进行单元测试(1)
- docker保存日志文件到本地
- Chapter 5 Blood Type——13
- Dev_GridView获取所选行的句柄
热门文章
- (LeetCode)二叉树中和为某一值的路径
- jQuery插件 -- Cookie插件
- 转换Arcgis Server REST接口实现OL2直接调用
- 2016.03.27,英语,《Vocabulary Builder》Unit 06
- UESTC--1272--Final Pan&#39;s prime numbers(水题)
- Python中functools模块函数解析
- QlikSense系列(1)——整体介绍
- 在64位linux上编译32位程序 for i386 intel
- surface 更新提示
- MyBatis数据持久化(十)与Spring4整合