ZOJ 3964 NIM变形
题意: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变形的更多相关文章
- HDU 3094 树上删边 NIM变形
基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...
- ZOJ 3964 Yet Another Game of Stones Nim游戏变种
ZOJ3964 解题思路 此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种.但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定.所以如果这个问题能够归结到正常的 Nim 博弈 ...
- ZOJ - 3591 NIM
ZOJ - 3591NIM 题目大意:给你n,s,w和代码,能生成长度为n的序列,问异或和不为0的子序列有多少个? 这是个挂羊头卖狗肉的题,和NIM博弈的关系就是要异或和不为0,一开始以博弈甚至循环节 ...
- zoj 3591 Nim 博弈论
思路:先生成序列再求异或,最多的可能为n*(n+1)/2: 在去掉其中必败的序列,也就是a[i]=a[j]之间的序列. 代码如下: #include<iostream> #include& ...
- hdu_1907:John(Nim变形)
题目链接 仍是取石子,不过取到最后一个的败 参考链接:http://www.voidcn.com/blog/liwen_7/article/p-3341825.html 简单一句话就是T2 S0必败 ...
- Paint the Grid Reloaded ZOJ - 3781 图论变形
Paint the Grid Reloaded Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %lld & %ll ...
- Atcoder #014 agc014_D 树形DP+nim变形
LINK 题意:两人在一颗树上做游戏,先手可以将树上一个节点染白,后手染黑,到最后时,所有与黑色相邻的白色同时变黑.如果还存在白色,先手胜,否则后手胜. 思路:首先不考虑树上,单独为链时,不管找规律也 ...
- hdu4318阶梯博弈nim变形
阶梯博弈原理参考:http://www.cnblogs.com/jiangjing/p/3849284.html 这题计算每两个之间的间隔就行了,如果是奇数个就把第一个前面的看作一个,偶数个就是两个点 ...
- zoj3591 Nim(Nim博弈)
ZOJ 3591 Nim(Nim博弈) 题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式). 方法是这样的,由于Nim博 ...
随机推荐
- 《Linux内核与分析》第六周
20135130王川东 1.操作系统的三大管理功能包括:进程管理,内存管理,文件系统. 2. Linux内核通过唯一的进程标识PID来区别每个进程.为了管理进程,内核必须对每个进程进行清晰的描述,进程 ...
- RabbitMQ 安装,配置
1:安装 yum install -y rabbitmq-server 2:主要程序介绍 # 管理插件的程序 /usr/sbin/rabbitmq-plugins # 服务程序 /usr/sbin ...
- Java的一些细节问题
一.Java求余%的结果符号取决于除数的符号位:小数也可以求余,余数仍为小数. package com.test; public class Test { /** * @author 容杰龙 */ p ...
- C语言文法阅读与理解
<翻译单元>--><外部声明>--><函数定义>|<申报> <函数定义>--><声明说明符>-->< ...
- java分页算法
int totalPageNum = (totalRecord + pageSize - 1) / pageSize;
- SharePoint 2016 Document Center Send To Connection
General Application setting->configure send to connection then i had to choose web application&qu ...
- babel-preset-env: a preset that configures Babel for you
转载 babel-preset-env is a new preset that lets you specify an environment and automatically enables t ...
- Ajax修改全局变量问题解决方法(Zepto版)
前两天项目遇到一个用ajax修改全局变量的案例,一开始无法给这个全局变量修改赋值,在网上查了一下,解决如下: 修改前: var word=1; $.ajax({ url:"myJSON.js ...
- 第124天:移动web端-Bootstrap轮播图插件使用
Bootstrap JS插件使用 > 对于Bootstrap的JS插件,我们只需要将文档实例中的代码粘到我们自己的代码中> 然后作出相应的样式调整 Bootstrap中轮播图插件叫作Car ...
- 【Python】Python对象类型及其运算
Python对象类型及其运算 基本要点: 程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改) 每个对象都有一个身份.一个类型.一个值 例: >>> a1 = ...