#1163 : 博弈游戏·Nim游戏

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

今天我们要认识一对新朋友,Alice与Bob。
Alice与Bob总是在进行各种各样的比试,今天他们在玩一个取石子的游戏。
在这个游戏中,Alice和Bob放置了N堆不同的石子,编号1..N,第i堆中有A[i]个石子。
每一次行动,Alice和Bob可以选择从一堆石子中取出任意数量的石子。至少取1颗,至多取出这一堆剩下的所有石子。
Alice和Bob轮流行动,取走最后一个石子的人获得胜利。
假设每一轮游戏都是Alice先行动,请你判断在给定的情况下,如果双方都足够聪明,谁会获得胜利?

提示:Nim?!

输入

第1行:1个整数N。表示石子堆数。1≤N≤100
第2行:N个整数,第i个整数表示第i堆石子的个数A[i],1≤A[i]≤10000

输出

第1行:1个字符串,若Alice能够获胜输出"Alice",否则输出"Bob"

样例输入

3
3 2 1
样例输出
Bob

对于这个游戏有一个非常神奇的结论:

对于一个局面,当且仅当A[1] xor A[2] xor ... xor A[N] = 0时,该局面为P局面。

对于这个结论的证明如下:
1. 全0状态为P局面,即A[i]=0,则A[1] xor A[2] xor ... xor A[N] = 0。
2. 从任意一个A[1] xor A[2] xor ... xor A[N] = k != 0的状态可以移动到A[1] xor A[2] xor ... xor A[N] = 0的状态。由于xor计算的特殊性,我们知道一定有一个A[i]最高位与k最高位的1是相同的,那么必然有A[i] xor k < A[i]的,所以我们可以通过改变A[i]的值为A[i]',使得A[1] xor A[2] xor ... xor A[i]' xor ... xor A[N] = 0。
3. 对于任意一个局面,若A[1] xor A[2] xor ... xor A[N] = 0,则不存在任何一个移动可以使得新的局面A[1] xor A[2] xor ... xor A[N] = 0。由于xor计算的特殊性,我们可以知道,一定是存在偶数个1时该位置的1才会被消除。若只改变一个A[i],无论如何都会使得1的数量发生变化,从而导致A[1] xor A[2] xor ... xor A[N] != 0。
以上三条满足ICG游戏中N,P局面的转移性质,所以该结论的正确性也得到了证明。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define MAXN 10010
#define MAXM 100010
#define INF 99999999
#define ll __int64
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)using namespace std;int Read()
{char c = getchar();while (c < '0' || c > '9') c = getchar();int x = 0;while (c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}return x;
}void Print(int a)
{if(a>9)Print(a/10);putchar(a%10+'0');
}int main()
{//fread;int n;while(scanf("%d",&n)!=EOF){int ans=0;for(int i=0;i<n;i++){int a;scanf("%d",&a);ans^=a;}if(ans) puts("Alice");else puts("Bob");}return 0;
}

#1172 : 博弈游戏·Nim游戏·二

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

Alice和Bob这一次准备玩一个关于硬币的游戏:
N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N。现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿,在一枚硬币翻转后决定要不要将该硬币左边的任意一枚硬币也翻一次(正面翻到背面或背面翻到正面)。翻最后一枚正面向上的硬币的人获胜。同样的,这次游戏里面Alice仍然先手,两人均采取最优的策略,对于给定的初始局面,Alice会获胜还是Bob会获胜?

提示:Turning Turtles

输入

第1行:1个正整数N,表示硬币数量。1≤N≤10,000
第2行:1个字符串,第i个字符表示编号为i的硬币状态,’H’表示正面朝上,’T’表示背面朝上。

输出

第1行:1个字符串,若Alice能够获胜输出"Alice",否则输出"Bob"

样例输入

8
HHTHTTHT
样例输出
Bob
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define MAXN 10010
#define MAXM 100010
#define INF 99999999
#define ll __int64
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)using namespace std;int Read()
{char c = getchar();while (c < '0' || c > '9') c = getchar();int x = 0;while (c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}return x;
}void Print(int a)
{if(a>9)Print(a/10);putchar(a%10+'0');
}
char ch[10010];int main()
{//fread;int n;while(scanf("%d",&n)!=EOF){getchar();scanf("%s",ch+1);int ans=0;for(int i=1;i<=n;i++){if(ch[i]=='H')ans^=i;}puts(ans?"Alice":"Bob");}return 0;
}

#1173 : 博弈游戏·Nim游戏·三

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但并不取走石子。比如说有一堆石子为k个,当Alice或者Bob行动时,可以将这一堆石子分成两堆,分别为x,y。满足x+y=k,x,y>0。那么增加了这一条规则后,在Alice总先手的情况下,请你根据石子堆的情况判断是Alice会获胜还是Bob会获胜?

提示:Sprague-Grundy

输入

第1行:1个整数N。表示石子堆数。1≤N≤100
第2行:N个整数,第i个整数表示第i堆石子的个数A[i],1≤A[i]≤20000

输出

第1行:1个字符串,若Alice能够获胜输出"Alice",否则输出"Bob"

样例输入

3
1 2 4
样例输出
Bob

局面上一共有N堆石子,每一次我们只能改变一堆石子。那么我们可以将每一堆石子看作一个单一游戏。
对于一堆石子,若该堆石子数量为0,就达到了终止状态,所以sg(0) = 0。
若其石子数量为k,接下来我们从k=1开始枚举递推每一个sg(k)。对于k,其可能的后继状态有:
(1)不分堆:石子数量为k’=0..k-1,则sg(k’)
(2)分堆:石子变为2堆,数量为(1,k-1),(2,k-2),…,(k-1,1)。设第一堆的石子数量为i,则sg值为sg(i) xor sg(k-i)。(这里用到了sg定理)
那么可以推算出sg(k) = mex{sg(0), sg(i), sg(i) xor sg(k - i) | i = 1..k-1}。

k     0 1 2 3 4 5 6 7 8 9 10 11 12 …
sg(k) 0 1 2 4 3 5 6 8 7 9 10 12 11 …

对于N堆石子,其sg值则为这N堆各自的sg值异或和。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define MAXN 10010
#define MAXM 100010
#define INF 99999999
#define ll __int64
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)using namespace std;int Read()
{char c = getchar();while (c < '0' || c > '9') c = getchar();int x = 0;while (c >= '0' && c <= '9') {x = x * 10 + c - '0';c = getchar();}return x;
}void Print(int a)
{if(a>9)Print(a/10);putchar(a%10+'0');
}int main()
{//fread;int n;while(scanf("%d",&n)!=EOF){int ans=0;for(int i=1;i<=n;i++){int a;scanf("%d",&a);if(a%4==0) a--;else if(a%4==3) a++;ans^=a;}puts(ans?"Alice":"Bob");}return 0;
}

hihocoder 博弈三连发相关推荐

  1. hihoCoder#: 博弈游戏·Nim游戏

    [题目链接]:click here~~ [题目大意]: #1163 : 博弈游戏·Nim游戏 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 今天我们要认识一对新朋友,A ...

  2. Nim博弈和威佐夫博弈 Return of the Nim

    Nim博弈 Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输. 后来,在一份资料上看到,这种游戏称为" ...

  3. 苹果改变手机型号_苹果的低碳铝将改变气候

    苹果改变手机型号 By Maria Gallucci 玛丽亚·加卢奇(Maria Gallucci) When Apple announced new climate goals last week, ...

  4. hihocoder #1163 : 博弈游戏·Nim游戏

    题意:有k堆石子,每次选择一堆,在这堆中取至少一个石子,第一个无石子可取的人为输. 思路:经典游戏,直接有结论:如果这些堆的石子数为:a1,a2,a3-an.那么a1到an的异或为0,则先手有必败策略 ...

  5. 浅谈 翻硬币游戏【Nim博弈】

    ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...

  6. 计算机安全事件现象级解决方案,现象级营销事件背后是一场科技博弈

    原标题:现象级营销事件背后是一场科技博弈 2018年过半,营销领域有多个"走心"的传播事件,成功占领了大众的心智. 首先是世界杯期间被玩坏和炮轰的电视广告案例:梅西代言蒙牛的开始画 ...

  7. POJ1067_取石子游戏_威佐夫博弈

    /* *State: 1067 Accepted 176K 16MS C++ 435B *题目大意: * 威佐夫博弈 *解题思路: * 略. */ #include <iostream> ...

  8. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

  9. BZOJ2275[Coci2010]HRPA——斐波那契博弈

    题目描述 N个石子,A和B轮流取,A先.每个人每次最少取一个,最多不超过上一个人的个数的2倍. 取到最后一个石子的人胜出,如果A要有必胜策略,第一次他至少要取多少个. 输入 第一行给出数字N,N< ...

最新文章

  1. Fiddler抓包工具详解(二)(fiddler菜单工具栏详解,相关快捷键)
  2. java 访问线程_java线程简介(共享对数据的访问)
  3. 新闻 | 聚焦技术领域现状与发展阿里巴巴知识图谱专场亮相云栖大会 阿里知识图谱亮相云栖大会产学深度交流推进业务创新
  4. java欧冠抽签,欧冠抽签吐槽:最大的“礼包”被C罗拿走!梅西出局概率超50%?...
  5. prompt set feedback set define的详解
  6. 文本预处理之判断是否包含非法字符或非英文字符(Java)
  7. android自定义View学习(二)----自定义绘图
  8. C语言中函数调用中静态变量的应用
  9. C++基础:C++的路径表示有哪些
  10. java yml文件_yml文件内容映射到pojo
  11. Java和python哪个好,学哪个有用。
  12. 一键开启macOS HiDPI
  13. 基于JAVA的GUI编程的的迷宫游戏 2020-12-15
  14. HDU3579 Hello Kiki(CRT非互质)
  15. 逆向实战 2#去除程序注册、正版校验,绕过联网校验
  16. Pandas知识点-绘制统计图
  17. hive:正则:匹配中文/英文/数字(REGEXP 和 rlike)
  18. leetcode 78.不含重复元素数组的子集
  19. 区块链世界里不能信什么?
  20. 大文件上传Jquery 插件Uploadify-v2.1.4使用图解

热门文章

  1. ABB机器人模块加密软件,代模块加密,加密之后别人就看不见你 写的程序,也无法打开,但是可以正常运行
  2. 视频剪辑 电脑录屏助手
  3. aftershokz蓝牙搜不到_硬核!小程序时怎么控制蓝牙设备的?
  4. 记录--Spyder打开时出现“An error occurred while starting the kernel“
  5. java es 如何查询_使用elasticsearch的java-api进行查询
  6. Google工具包Guava——聊聊代码校验Preconditions
  7. 全排列的java算法_全排列算法原理和实现
  8. 一个古老故事--线程和线程池的故事
  9. uniapp之小程序端生成分享海报(带自定义参数的二维码)
  10. 几款有意思的html游戏推荐(在线云玩+源码)