ZOJ3964

解题思路

此题的题意比较容易理解,可以简单的看着 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游戏变种的更多相关文章

  1. Nim游戏变种——取纽扣谁先取完

    (2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和D ...

  2. Nim游戏变种——取纽扣游戏

    (2017腾讯实习生校招笔试题)Calvin和David正在玩取纽扣游戏,桌上一共有16个纽扣,两人轮流来取纽扣,每人每次可以选择取1个或3个或6个(不允许不取),谁取完最后的纽扣谁赢.Cavin和D ...

  3. [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 ...

  4. LeetCode 292 Nim Game(Nim游戏)

    翻译 你正在和你的朋友们玩以下这个Nim游戏:桌子上有一堆石头.每次你从中去掉1-3个.谁消除掉最后一个石头即为赢家.你在取出石头的第一轮. 你们中的每个人都有着聪明的头脑和绝佳的策略.写一个函数来确 ...

  5. Nim游戏

    目前有3堆石子,每堆石子个数也是任意的,双方轮流从中取出石子,规则如下:1)每一步应取走至少一枚石子:每一步只能从某一堆中取走部分或全部石子:2)如果谁不能取谁就失败. Bouton定理: 必败状态当 ...

  6. BZOJ 3105 [CQOI2013]新Nim游戏 ——线性基

    [题目分析] 神奇的题目,两人都可以第一次取走足够多堆的石子. nim游戏的规则是,如果异或和为0,那么就先手必输,否则先手有必胜策略. 所以只需要剩下一群异或和为0就可以了. 先排序,线性基扫一遍即 ...

  7. 【BZOJ-2460&3105】元素&新Nim游戏 动态维护线性基 + 贪心

    3105: [cqoi2013]新Nim游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 490[Submit][Stat ...

  8. 【BZOJ】3105: [cqoi2013]新Nim游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...

  9. BZOJ3105: [cqoi2013]新Nim游戏 博弈论+线性基

    一个原来写的题. 既然最后是nim游戏,且玩家是先手,则希望第二回合结束后是一个异或和不为0的局面,这样才能必胜. 所以思考一下我们要在第一回合留下线性基 然后就是求线性基,因为要取走的最少,所以排一 ...

随机推荐

  1. JavaScript中整型数据使用

    JavaScript中整型数据使用 制作人:全心全意 JavaScript的数字格式允许精确地表示-900719925474092(-253)和900719925474092(253)之间的所有整数, ...

  2. cgi fastcgi php-cgi php-fpm

      参考: 摘至:http://www.cnblogs.com/thinksasa/p/4497567.html 详说fastcgi,php-fpm的区别:http://segmentfault.co ...

  3. Matplotlib中的颜色

    使用matplotlib中会遇到选择颜色的问题,很多人会觉得自带的matlab风格的颜色不好看.好在Matplotlib已经预见到了这个问题,除了支持最基本的matlab传统颜色之外,还支持很多种颜色 ...

  4. 第十八节:Scrapy爬虫框架之settings文件详解

    # -*- coding: utf-8 -*- # Scrapy settings for maoyan project## For simplicity, this file contains on ...

  5. 集训第四周(高效算法设计)G题 (贪心)

    G - 贪心 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Desc ...

  6. Xcode8、 iOS10 适配问题

    调用相机.相册.麦克风.位置等隐私问题崩溃解决办法 你的项目中访问了隐私数据,比如:相机,相册,联系人等,在Xcode8中打开编译的话,统统会crash,控制台会输出下面这样的日志: 这是因为iOS对 ...

  7. [luoguP1097] 统计数字(水)

    传送门 这么水的题,也只有提高组第一题了吧 代码 #include <cstdio> #include <iostream> #include <algorithm> ...

  8. Django组件:(6)cookie 和 session

    会话:会话可理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应:在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束. 在一个会话的 ...

  9. Nginx 的 server_names_hash_bucket_size 问题

    在 Nginx 0.6.35 的版本中,配置多个 server 虚拟主机,必须要在配置文档中 http { 里头加上 server_names_hash_bucket_size 64; 这么一句 ht ...

  10. Pagodas 等差数列

    nn pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, ...