LINK

题意:n堆石子,Alice 和 Bob 轮流取石子,谁不能再取或被对方取完为败。但是对于alice拥有限制:b=0此堆正常无限制;b=1此堆Alice只能取奇数个石子;b=2只能取偶数个石子

思路:一看就知道是个NIM的变形题,现在想做这题的思路应当是讨论奇偶个石子且分别在奇数偶数限制下的胜负状况。

很容易能看出当有两堆以上的限制堆时(a=1 b=1不算限制)显然是Alice必败,这是最重要的条件,可以避免大量的推导。

再者讨论b=1的情况:

如果a为偶数,显然该堆可被Bob保证不被Alice一次拿完——直至剩下1颗,此时必定是Bob的回合。

如果a为奇数,如果Alice不取完该堆,Bob可以使该堆变为偶数堆,也可以直接取完,显然对于前者相当于转换到a为偶数的情况,对于后者,相当于不存在该堆,B可控制A的先后手,故A必败。那么如果Alice取完,相当于先后手交换。

最后讨论b=2的情况:

如果a为偶数,如果Alice不取完该堆,Bob可以使该堆变为奇数堆,也可以直接取完,类似于上种情况。先后手互换。

如果a为奇数,那么因为Alice不能取而必败

抱怨一下比赛的时候交了两发WA也没过,也没考虑这么仔细,先后手交换的本应该另加讨论的,我却直接异或了2...

#include <bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std;
const int N = 1e5+5;
int a[N], b[N];
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int cnt = 0;
int ans = 0;
int flag = 0;
for(int i = 1; i <= n; ++i)
scanf("%d", &a[i]); for(int i = 1; i <= n; ++i)
{
scanf("%d", &b[i]);
if(b[i] == 1 && a[i] == 1)
ans ^= 1;
else if(b[i] == 1)
{
cnt++;
if(cnt > 1)//有两堆以上限制先手必败
continue;
flag = 1;//必定先后手互换
if(a[i] % 2 == 0) //留1颗
ans ^= 1;
//else ans ^= 0;//先手取完
}
if(b[i] == 2)
{
cnt++;
if(cnt > 1)
continue;
if(a[i] % 2 == 0) //取完,互换先后手
flag = 1;
if(a[i] % 2 == 1) //先手必败 必定会留下一颗
cnt++;
}
if(b[i] == 0)
ans ^= a[i];
}
if(cnt >= 2)
printf("Bob\n");
else if(cnt == 1)
{
if(ans && flag)
printf("Bob\n");
else
printf("Alice\n");
}
else
{
if(ans)
printf("Alice\n");
else
printf("Bob\n");
}
}
return 0;
}

ZOJ 3964 NIM变形的更多相关文章

  1. HDU 3094 树上删边 NIM变形

    基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...

  2. ZOJ 3964 Yet Another Game of Stones Nim游戏变种

    ZOJ3964 解题思路 此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种.但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定.所以如果这个问题能够归结到正常的 Nim 博弈 ...

  3. ZOJ - 3591 NIM

    ZOJ - 3591NIM 题目大意:给你n,s,w和代码,能生成长度为n的序列,问异或和不为0的子序列有多少个? 这是个挂羊头卖狗肉的题,和NIM博弈的关系就是要异或和不为0,一开始以博弈甚至循环节 ...

  4. zoj 3591 Nim 博弈论

    思路:先生成序列再求异或,最多的可能为n*(n+1)/2: 在去掉其中必败的序列,也就是a[i]=a[j]之间的序列. 代码如下: #include<iostream> #include& ...

  5. hdu_1907:John(Nim变形)

    题目链接 仍是取石子,不过取到最后一个的败 参考链接:http://www.voidcn.com/blog/liwen_7/article/p-3341825.html 简单一句话就是T2 S0必败 ...

  6. Paint the Grid Reloaded ZOJ - 3781 图论变形

    Paint the Grid Reloaded Time Limit: 2000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %ll ...

  7. Atcoder #014 agc014_D 树形DP+nim变形

    LINK 题意:两人在一颗树上做游戏,先手可以将树上一个节点染白,后手染黑,到最后时,所有与黑色相邻的白色同时变黑.如果还存在白色,先手胜,否则后手胜. 思路:首先不考虑树上,单独为链时,不管找规律也 ...

  8. hdu4318阶梯博弈nim变形

    阶梯博弈原理参考:http://www.cnblogs.com/jiangjing/p/3849284.html 这题计算每两个之间的间隔就行了,如果是奇数个就把第一个前面的看作一个,偶数个就是两个点 ...

  9. zoj3591 Nim(Nim博弈)

    ZOJ 3591 Nim(Nim博弈) 题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式). 方法是这样的,由于Nim博 ...

随机推荐

  1. 敏捷开发与xp实践 实验报告

    20162315 敏捷开发与xp实践 实验报告 实验任务 1.在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好 ...

  2. 周总结<4>

    经过了一周的学习,我们在html以及C语言方面又有的新的知识点的学习. html 自习表格,函数等 C语言 哈弗曼编码 Html案例: 一. <!DOCTYPE html PUBLIC &quo ...

  3. 《剑指offer》--- 两个链表的第一个公共结点

    本文算法使用python3实现 1. 问题   输入两个链表,找出它们的第一个公共结点.   时间限制:1s:空间限制:32768K 2 思路描述   使用两个指针 $ p1,p2 $ 分别指向两个链 ...

  4. HTMLA内联框架

    <head> <meta charset="utf-8" /> <title>内联框架</title> </head> ...

  5. 201621123037 《Java学习设计》 第五周学习总结

    Week05-继承.多态.抽象类与接口 1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键词:接口."has-a".多态.comparable.Compa ...

  6. 【第九周】beta-review阶段贡献分分配

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成荣 李峤 杨柳 李峤 ...

  7. linux自启动、定时启动脚本

    linux开机自启动 想让一个程序.脚本开机自启动,可以在/etc/rc.d目录下面找到rc.local文件,编辑该文件,在尾部加上需要运行的命令即可. 如: #cd /etc/rc.d #sudo ...

  8. 第182天:HTML5——地理定位

    HTML5 Geolocation(地理定位) HTML5 Geolocation API 用于获得用户的地理位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. 浏览器支 ...

  9. 第111天:Ajax之jQuery实现方法

    由于jQuery中的Ajax方法是用了内置的deferred模块,是Promise模式的一种实现,而我们这里没有讲过,所以我们就不使用这一模式啦. 我们只定义一个Ajax方法,他可以简单的get,po ...

  10. .net下使用NPOI读取Excel表数据

    这里只写MVC下的情况 public ActionResult Index() { var path = Server.MapPath(@"/content/user.xlsx") ...