ZOJ-3964 Yet Another Game of Stones
题意: Alice 和 Bob 在进行取石子游戏, 现在一共有n堆石子, 每堆石头有ai个, 然后每堆石头有一个bi属性, 如果bi == 0, Alice取这堆石头就没有限制, 如果bi == 1 那么Alice对这堆石子一次只能取奇数个, 如果bi == 2那么Alice 对这堆石头一次只能取奇数个, 所有石头堆对于Bob来说说取法都没有限制。
题解:首先我们可以知道 如果存在一个 a = 1, b = 2。 那么Alice无法取这堆, Bob只要将这一堆留到最后, 当其他堆取完的时候下一个是Alice, Alice不能取这堆,所以Bob赢了, 如果下一个取的人是Bob, Bob可以取这一堆, 当Bob取完这一堆的时候,Alice没有东西取所以Bob赢了。
如果存在一个 a = 偶数, b = 1, 那么Alice最少要分2次奇数去取,如果就剩下这一堆的时候, 轮到Alice, Alice取完之后 Bob还能拿走剩下的,所以Bob赢了,如果轮到Bob, Bob可以直接取完, 所以Bob还是胜利的。
如果 a = 偶数, b = 2, Alice就可以直接将这一堆取完, 就不会让Bob形成 a = 1, b = 2的情况, 但是 如果有另外一堆 a = 偶数, b = 2的石头, Alice 可以取完2堆中的一堆, 但是Bob可以使得另外一堆形成 a = 1, b = 2的状态, Bob就必胜了。也就是说如果有2堆 b = 2, Bob必胜, 如果 a = 奇数, b = 2, Bob必胜。
现在来看 b = 1的情况, 如果b = 1, Alice 不先手将这一堆取完或者 将这一堆变成剩余1的状态, Bob就可以将这一堆变成a = 2, b = 1, 那么Bob 就不会输了。
所以如果有2堆 b = 1 && a != 1, Alice 可以解决一堆, 但是Bob就可以将另一堆变成 a = 2, b = 1的状态, Bob也会胜利。
由上面来看, 当b =1 || b = 2的时候, Alice 都要先解决这一堆, 如果有另外一堆 b == 1||b==2,Bob就可以形成将这堆石头变成不会失败的状态。
当然 如果 只有b = 0的情况, 那么Nimi 博弈 的结论就适用了。
所以:当然 有一个 b = 1, a = 奇, 那么ALice 要先手将这堆取完, 并且对于别的堆来说 先后手就改变了。
如果有一个 b = 1, a = 偶数, 那么ALice要先手将这堆取成剩下数目为1, 那么将这个1 也放进nimi就, 并且改变先后手的状态就好了。
如果有一个 b = 2, a = 偶数, 那么ALice 要先手将这堆取完, 并且对于别的堆来说 先后手就改变了。
如果有一个b = 2, a = 奇数, 那么ALice就已经输了。
如果出现2堆上述的特殊状态, 那么ALice也输了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
const int INF = 0x3f3f3f3f;
const LL mod = 1e9+;
typedef pair<int,int> pll;
const int N = 1e5+;
int a[N], b[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n, t = , cnt = , flag = ;
scanf("%d",&n);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i <= n; i++) scanf("%d", &b[i]);
for(int i = ; i <= n; i++){
if(b[i] == ){
t ^= a[i];
}
else if(b[i] == && a[i] == ) t ^= a[i];
else if(b[i] == && a[i]&) cnt++;
else if(b[i] == && a[i]% == ) cnt++, t ^= ;
else if(b[i] == && a[i]&) flag = ;
else if(b[i] == && a[i]% == ) cnt++;
}
if(flag || cnt >= ) cout << "Bob\n";
else {
if(t != ){
if(cnt == ) cout << "Alice\n";
else cout << "Bob\n";
}
else {
if(cnt != ) cout << "Alice\n";
else cout << "Bob\n";
}
}
}
return ;
}
ZOJ-3964 Yet Another Game of Stones的更多相关文章
- ZOJ 3964 Yet Another Game of Stones Nim游戏变种
ZOJ3964 解题思路 此题的题意比较容易理解,可以简单的看着 Nim 博弈的变种.但问题在于 Alice 对第 i 堆石子的取法必须根据 bi 确定.所以如果这个问题能够归结到正常的 Nim 博弈 ...
- ZOJ 3964 NIM变形
LINK 题意:n堆石子,Alice 和 Bob 轮流取石子,谁不能再取或被对方取完为败.但是对于alice拥有限制:b=0此堆正常无限制:b=1此堆Alice只能取奇数个石子:b=2只能取偶数个石子 ...
- POJ 2235 Frogger / UVA 534 Frogger /ZOJ 1942 Frogger(图论,最短路径)
POJ 2235 Frogger / UVA 534 Frogger /ZOJ 1942 Frogger(图论,最短路径) Description Freddy Frog is sitting on ...
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- ZOJ 3686 A Simple Tree Problem
A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a rooted tree, each no ...
- ZOJ Problem Set - 1394 Polar Explorer
这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...
- ZOJ Problem Set - 1392 The Hardest Problem Ever
放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...
- ZOJ Problem Set - 1049 I Think I Need a Houseboat
这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...
- ZOJ Problem Set - 1006 Do the Untwist
今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...
- ZOJ Problem Set - 1001 A + B Problem
ZOJ ACM题集,编译环境VC6.0 #include <stdio.h> int main() { int a,b; while(scanf("%d%d",& ...
随机推荐
- 先定一个小目标:10天自学C语言编程,教你如何改变一生
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 【游记】NOIP2019复赛
声明 我的游记是一个完整的体系,如果没有阅读过往届文章,阅读可能会受到障碍. ~~~上一篇游记的传送门~~~ 前言 (编辑中)
- mybatis学习笔记(三)
mybatis增删改 概念: 功能:从应用程序角度出发,软件具有哪些功能: 业务:完成功能时的逻辑,对应service的一个方法: 事务:从数据库角度出发,完成业务时需要执行的SQL集合,统称一个事务 ...
- 【0725 | Day 1】计算机编程/计算机组成原理/计算机操作系统
什么是编程 编程语言:人与计算机交流的手段 编程:通过编程语言编写文件 学习编程的目的:让计算机代替人力,为我们服务 计算机组成原理 计算机由五大部分组成:控制器.运算器.存储器.输入设备.输出设备. ...
- Docker笔记(八):数据管理
前面(哪个前面我也忘了)有说过,如果我们需要对数据进行持久化保存,不应使其存储在容器中,因为容器中的数据会随着容器的删除而丢失,而因通过将数据存储于宿主机文件系统的形式来持久化.在Docker容器中管 ...
- SAP-批量删除生产订单
1.SE38运行:PPARCHP1 2.先用COOIS导出订单,已经CLSD,没有删除的
- 100天搞定机器学习|Day36用有趣的方式解释梯度下降算法
本文为3Blue1Brown神经网络课程讲解第二部分<Gradient descent, how neural networks learn >的学习笔记,观看地址:www.bilibil ...
- 写给新手的 Go 开发指南
转眼加入蚂蚁已经三个多月,这期间主要维护一 Go 写的服务器.虽然用的时间不算长,但还是积累了一些心得体会,这里总结归纳一下,供想尝试 Go 的同学参考. 本文会依次介绍 Go 的设计理念.开发环境. ...
- 为什么选择B+树作为数据库索引结构?
背景 首先,来谈谈B树.为什么要使用B树?我们需要明白以下两个事实: [事实1] 不同容量的存储器,访问速度差异悬殊.以磁盘和内存为例,访问磁盘的时间大概是ms级的,访问内存的时间大概是ns级的.有个 ...
- git使用WebHook实现自动构建
说明 我们使用git进行版本管理常常会遇到这样的一个需求,希望git push的时候服务器上代码的代码也能自动更新,这次我使用了coding进行示范 一.编写git pull 更新脚本 auth_pu ...