ZOJ 3964 Yet Another Game of Stones Nim游戏变种
解题思路
此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种。但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定。所以如果这个问题能够归结到正常的 Nim 博弈(取石子问题),则很容易解决。
考虑特判存在 bi=1 或 bi=2 的情况:
- 如果存在第 i 堆石子,其 ai 为奇数且 bi=2 ,则 Bob 必胜(Alice 在最优策略下无法取完该堆,但 Bob 可以)。
- 如果存在 2 个及以上 bi=2 或 bi=1 且 ai>1 的情况,则 Bob 必胜。
- 如果只有一个 bi=2 (其余都为 bx=0 ) 的情况,则 Alice 为了胜利,必须先将该堆石子取完(否则 Bob 只需取掉该堆 1 个石子, Bob 必胜)。此时问题等同于 n-1 堆石子,Bob 先手的 Nim 博弈。
- 如果只有一个 bi=1 且 ai>1 (其余都为 bx=0 )的情况,Alice 同样需先将该堆石子取完(或只剩一个)。此时问题等同于 n-1(n) 堆石子,Bob 先手的 Nim 博弈。
对于只有 bi=0 的情况,Nim 博弈全部 ai 异或即可。
经典的Nim游戏 只要连续取异或XOR就可以判断胜负状态。
- #include<bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + 10;
- int a[N], b[N], n;
- bool jug()
- {
- int cnt[3] = {0, 0, 0}, tot = 0;
- for(int i=1;i<=n;i++)
- {
- if(a[i]%2 && b[i] == 2) return false;
- if(b[i] == 2) cnt[2]++, cnt[0]++;
- if(a[i] > 1 && b[i] == 1) cnt[1]++, cnt[0]++;
- }
- if(cnt[0]>1) return false;
- if(cnt[1] == 1) {
- for(int i=1;i<=n;i++)
- if(b[i] == 1 && a[i] > 1) tot ^= (a[i]%2?0:1);
- else tot ^= a[i];
- return !(tot?1:0);
- }
- else if(cnt[2] == 1) {
- for(int i=1;i<=n;i++)
- if(b[i] != 2)
- tot ^= a[i];
- return !(tot?1:0);
- }
- else {
- for(int i=1;i<=n;i++)
- tot ^= a[i];
- return tot;
- }
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++)
- scanf("%d",&a[i]);
- for(int i=1;i<=n;i++)
- scanf("%d",&b[i]);
- printf("%s\n", jug() ? "Alice" : "Bob");
- }
- }
ZOJ 3964 Yet Another Game of Stones Nim游戏变种的更多相关文章
- Nim游戏变种——取纽扣谁先取完
(2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和D ...
- Nim游戏变种——取纽扣游戏
(2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和D ...
- [Swift]LeetCode292. Nim游戏 | Nim Game
You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...
- LeetCode 292 Nim Game(Nim游戏)
翻译 你正在和你的朋友们玩以下这个Nim游戏:桌子上有一堆石头.每次你从中去掉1-3个.谁消除掉最后一个石头即为赢家.你在取出石头的第一轮. 你们中的每个人都有着聪明的头脑和绝佳的策略.写一个函数来确 ...
- Nim游戏
目前有3堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:1)每一步应取走至少一枚石子:每一步只能从某一堆中取走部分或全部石子:2)如果谁不能取谁就失败. Bouton定理: 必败状态当 ...
- BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基
[题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...
- 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心
3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 839 Solved: 490[Submit][Stat ...
- 【BZOJ】3105: [cqoi2013]新Nim游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...
- BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基
一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...
随机推荐
- ResNet实战
目录 Res Block ResNet18 Out of memory # Resnet.py #!/usr/bin/env python # -*- coding:utf-8 -*- import ...
- i2c精简总结
基本的i2c的编程包括:读数据,写命令,写数据 有关i2c的时序需要的话查看这里http://blog.csdn.net/qqliyunpeng/article/details/41511347 1. ...
- 04001_HTML简单介绍
1.超文本标记语言 (1)超文本:比普通文本功能更加强大: (2)标记语言:使用一组标签对内容进行描述的一门语言,它不是编程语言! 2.HTML语法和规范 (1)所有的html文件后缀名都是以.htm ...
- 【Codeforces 444A】DZY Loves Physics
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 两个点的子图他们的"密度"是比所有联通生成子图都要大的 "只要胆子大,遇到什么问题都不怕!" [代码] ...
- Xcode报referenced from错误的总结
一.库文件丢失 如果提示的文件是库文件,比如说是sdk的文件,有可能是就是丢失,或者没有引用到该工程. 1.点击这个.a库,或者framework,看右边的target里面是否引用到了当前的targe ...
- [luoguP2401] 不等数列
传送门 f[i][j]表示前i个数有j个<的方案数 #include <cstdio> #define N 1001 #define p 2015 int n, k; int f[N ...
- 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- 【ZJOI2017 Round1练习】D8T2 sequence(DP)
题意: 思路: #include <algorithm> #include <iostream> #include <cstring> #include <c ...
- Ubuntu 16.04安装7zip的图形界面工具PeaZip
其实PeaZip不是7zip的图形界面工具,而是一整套方案,里面包括了7z格式的解压缩等. PeaZip Linux版本只有32位包,如果你使用的是64位Ubuntu系统,那么先打开终端运行下面的命令 ...
- oracle的processes和session最大限制
1.现象:oracle运行了一段时间后出现用户名连接不上,提示process已经达到最大值. 2.解决: --管理员身份登录 sqlplus / as sysdba --修改processes最大值, ...