2017山东省赛A题(SDUT3893威佐夫博弈+尼姆博奕)
来源:互联网 发布:稀疏编码算法 详解 编辑:程序博客网 时间:2024/05/19 23:14
题意:
G组数据(g<15)
每组数据有n堆石子(n是质数)
接下来是n堆石子数(1≤pilesi≤10^5)
取法:选择一堆取k个,每堆石子取k个
n==2是
是威佐夫博弈
威佐夫博弈
n>2时,第一种取法是典型的nim博弈,而第二种会产生什么影响呢
举个例子:
有3堆石子,分别是15,6,9 然后转换为二进制形式
1 1 1 1
0 1 1 0
1 0 0 1
此时为P态,进行普通Nim操作肯定会破会P态转移到N态,所以此时不会选取这种操作,那么只能尝试对每堆进行取任意满足条件的k个石子,发现不管怎么取完之后P态也必定会被破坏。原因是,假如对每堆取K个它们二进制最小的位代表的个数个,则取完之后此位的二进制值都会被取反,所以破坏了P态,而且题目的要求是素数个堆(除2外都是奇数),对其他满足条件的二进制位进行取也是如此。所以当n>2时,对P态进行取同k个操作只会破坏P态,而不会得到想要的P态->P态,而当为N态时,只需进行普通的Nim操作就可使N态转化为P态,故加入同取k个操作之后也是满足普通Nim堆的。
所以当n>2时,同时取k个石子对nim没有影响,即可以把这个游戏看作尼姆游戏.
code:
//威佐夫博弈+尼姆博奕#include<cstdio>#include<math.h>int main(){ int kase; scanf("%d",&kase); while(kase--) { int n; scanf("%d",&n); if(n==2) { int a,b,c; scanf("%d%d",&a,&b); if(a>b) { c=a; a=b; b=c; } c=b-a; int w=(int )(((sqrt(5.0)+1.0)/2.0)*c); if(w==a) printf("Watson\n"); else printf("Sherlock\n"); } else{ int res=0; for(int i=0;i<n;i++) { int a; scanf("%d",&a); res^=a; } if(res==0) printf("Watson\n"); else printf("Sherlock\n"); } } return 0;}
阅读全文
0 0
- 2017山东省赛A题(SDUT3893威佐夫博弈+尼姆博奕)
- Return of the Nim----Nim博弈+威佐夫博弈 山东省第八届省赛A题
- 山东省赛-博弈-Game
- 2017第八届浪潮杯山东省赛 A.Return of the Nim 博弈
- 山东省第八届acm省赛A题 博弈
- 16山东省赛A题
- SDUT 3893 (山东省第八届ACM省赛A题) Return of the Nim 博弈nim+威佐夫
- 山东省赛A题:Rescue The Princess
- 【补题】2017山东省赛A题 Return of the Nim
- 2017山东省赛B题Quadrat
- 2017山东省赛总结
- 2017山东省赛 Fireworks
- 2013山东省赛回顾A、F、I
- 第七届ACM山东省赛-A Julyed
- 山东省第7届省赛 A题 Julyed
- 山东省第八届ACM省赛A题
- 2017 ACM山东省赛 D
- 2016山东省赛H题
- 装饰者模式
- python构造方法
- 读《SeqSLAM: Visual Route-Based Navigation for Sunny Summer Days and Stormy Winter Nights》
- caioj1092: 并查集(模版 家族)
- hdu-1372 Knight Moves
- 2017山东省赛A题(SDUT3893威佐夫博弈+尼姆博奕)
- nginx日志格式配置
- 仿今日头条的频道管理
- CentOS 上 Jenkins 安装
- GIT 学习笔记
- 程序的编译和链接过程
- Bounding box Regression详解
- 韩信点兵
- Android JNI学习入门之使用C++链表结构存储数据