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也输了。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define ULL unsigned LL
 5 #define fi first
 6 #define se second
 7 #define lson l,m,rt<<1
 8 #define rson m+1,r,rt<<1|1
 9 #define max3(a,b,c) max(a,max(b,c))
10 const int INF = 0x3f3f3f3f;
11 const LL mod = 1e9+7;
12 typedef pair<int,int> pll;
13 const int N = 1e5+5;
14 int a[N], b[N];
15 int main(){
16     int T;
17     scanf("%d",&T);
18     while(T--){
19         int n, t = 0, cnt = 0, flag = 0;
20         scanf("%d",&n);
21         for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
22         for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
23         for(int i = 1; i <= n; i++){
24             if(b[i] == 0){
25                 t ^= a[i];
26             }
27             else if(b[i] == 1 && a[i] == 1) t ^= a[i];
28             else if(b[i] == 1 && a[i]&1) cnt++;
29             else if(b[i] == 1 && a[i]%2 == 0) cnt++, t ^= 1;
30             else if(b[i] == 2 && a[i]&1) flag = 1;
31             else if(b[i] == 2 && a[i]%2 == 0) cnt++;
32         }
33         if(flag || cnt >= 2) cout << "Bob\n";
34         else {
35             if(t != 0){
36                 if(cnt == 0) cout << "Alice\n";
37                 else cout << "Bob\n";
38             }
39             else {
40                 if(cnt != 0) cout << "Alice\n";
41                 else cout << "Bob\n";
42             }
43         }
44     }
45     return 0;
46 }

转载于:https://www.cnblogs.com/MingSD/p/8544920.html

ZOJ-3964 Yet Another Game of Stones相关推荐

  1. zoj 3964 - Yet Another Game of Stones

    zoj 3964 - Yet Another Game of Stones // 2017zjpc 传送门 题意: 有n堆石子,每堆有一个限制0,1,2,限制只对Alice生效,分别表示没有限制,只能 ...

  2. ZOJ 3964 Yet Another Game of Stones (博弈)

    题意:题意跟普通的nim博弈差不多  就是一位选手取的时候 加了一个限制条件 思路: 1.全部b[i]=0 那么 这个就是Al先手的NIM博弈 2.有多个b[i]>=1&&a[i ...

  3. ZOJ 3964 NIM变形

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

  4. 020_boxel_rebound

    title 020<Boxel Rebound>"嗨到中毒"的弹跳小方块(附自制赛道分享方法) Boxel Rebound是一款和Google浏览器断网小恐龙类似的弹跳 ...

  5. 每日打卡 2017.04.02 博弈论专题

    https://vjudge.net/contest/156519#overview 打表:比如求斐波那契的第k项,k<=1000,很多case,这时可以预处理的时候把1-1000全部求出来并储 ...

  6. ZOJ 3964Yet Another Game of Stones 扩展尼姆博弈

    ZOJ 3964Yet Another Game of Stones 扩展尼姆博弈 题意 思路 Code 传送门: 题意 给n堆石头,每堆石头有a个数量和b性质.Alice和Bob玩游戏,每次只能在一 ...

  7. 15行代码AC——ZOJ - 4118 Stones in the Bucket(思维题+优化方案)(第十届山东省ACM程序设计竞赛F题)

    励志用少的代码做高效表达. 思路分析 题意:给定n个数,问最少操作几次,使数列中的数全部相等. 操作一:将数列中任意数减一. 操作二:将数列中任意数减一.任意数加一(相当于把1挪过去) 涉及到最少的题 ...

  8. ZOJ 3380 Patchouli's Spell Cards(概率DP)

    Patchouli's Spell Cards Time Limit: 7 Seconds      Memory Limit: 65536 KB Patchouli Knowledge, the u ...

  9. ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!

    两题水题: 1.如果一个数能被分解为两个素数的乘积,则称为Semi-Prime,给你一个数,让你判断是不是Semi-Prime数. 2.定义F(0) = 7, F(1) = 11, F(n) = F( ...

  10. zoj 1204 Additive equations

    ACCEPT acm作业 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204 因为老师是在集合那里要我们做这道题.所以我很是天 ...

最新文章

  1. python培训班靠谱的-Python培训机构就业靠不靠谱?
  2. [Tips on Ember 2] 如何尝试 angle-bracket component
  3. java的环境变量classpath中加点号 ‘.’ 的作用
  4. visio对象放入word显示不全_办公人士必学visio技能 手把手教你使用visio绘制项目全景图!...
  5. 我的学习工作经历,一个园林专业中专毕业生的IT之路
  6. julia自然常数_Julia中的Sys.KERNEL常数
  7. 电子计算机工程学,电子计算机工程学荣誉工学士资料.ppt
  8. 正式宣布DXBC2GLSL,HLSL字节码到GLSL的编译器
  9. python如何爬虫eps数据_Python爬虫常用的几种数据保存方式
  10. 数据治理的目的与意义
  11. 安装QTP10.0 报需要先安装 c++组件
  12. PopupWindow点击空白区域消失
  13. spring5教程(一)——Overview
  14. win10熄屏时间不对_详解win10屏幕熄屏时间设置教程
  15. 如何在jupyter notebook中设置一级二级三级标题?
  16. 华为员工工作生活及待遇全面揭秘
  17. nginx反向代理实现直接域名访问
  18. Android桌面小插件——Widget
  19. 3306π金牌讲师,甜橙金融(翼支付)高级总监张小虎专访
  20. WPF管理平台 (一)- 登录页面

热门文章

  1. 江西单招计算机专业大学排名,2018年江西高职单招院校名单有哪些
  2. 【VOA英语学习--0207】关于AI
  3. CSIG图像图形技术挑战赛重磅来袭!人体目标检测分赛道正式开放注册!
  4. 大佬分享:180+道Java面试题目!含答案解析!
  5. Java实战:粒子群算法
  6. AAA认证——IE阶段
  7. Could not find messages which '/home/flying/catkin_ws/src/beginner_tutorials/msg/Num.msg' depends
  8. 全球计算机科学研究生排名,新|美国计算机科学研究生专业世界排名靠50强名单...
  9. 计算机工作站,大厂设计专用出差笔记本?戴尔3551+代图形设计工作站
  10. xml文件中处理大于号小于号的方法