博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1874: [BeiJing2009 WinterCamp]取石子游戏(博弈论+SG函数入门)
阅读量:4694 次
发布时间:2019-06-09

本文共 1316 字,大约阅读时间需要 4 分钟。

昨天在唐神的引导下看了有关博弈论的知识,总算是有点了解,觉得这东西比较抽象,但是很神奇很有趣。

一个nim游戏中,每堆石子的sg函数其实可以理解为此状态到不了的状态,我觉得从某种意义上来讲就可以代表此状态

判断一个游戏局面先手是否必胜,求所有点的sg值得亦或和sum

sum为0必败,其他必胜。原理可以百度“博弈论 sg函数”有详解

同时如果有若干个子游戏,则sum为若干个子游戏的亦或和

虽然看是看懂了,但是实际运用起来并不怎么通透。。

此题为入门题,预处理出sg值

sg值可以由所能到达的各状态的sg值推得

1 #include
2 #include
3 #include
4 using namespace std; 5 const int maxn = 15; 6 int n,a[maxn],ans,sg[1001],f[maxn],m,hash[1001]; 7 8 void get_sg(){ 9 sg[0]=0;10 for (int i=1; i<=1000; i++){11 for (int j=1; j<=m && i-f[j]>=0; j++)12 hash[sg[i-f[j]]]=i;13 for (int j=0; j<=i+1; j++)14 if (hash[j]!=i){sg[i]=j;break;}15 }16 }17 18 int main(){19 scanf("%d", &n);20 for (int i=1; i<=n; i++) scanf("%d", &a[i]); 21 scanf("%d", &m);22 for (int i=1; i<=m; i++) scanf("%d", &f[i]);23 get_sg();24 for (int i=1; i<=n; i++) ans^=sg[a[i]];25 if (!ans){puts("NO");return 0;}26 for (int i=1; i<=n; i++){27 int tmp=ans^sg[a[i]];28 for (int j=1; j<=m && a[i]>=f[j]; j++)29 if (!(tmp^sg[a[i]-f[j]])){30 puts("YES");31 printf("%d %d\n", i, f[j]);32 return 0;33 }34 }35 return 0; 36 }

 

转载于:https://www.cnblogs.com/mzl120918/p/6309030.html

你可能感兴趣的文章
PAT(B) 1014 福尔摩斯的约会(Java)
查看>>
PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
查看>>
项目开发总结报告(GB8567——88)
查看>>
SSH加固
查看>>
端口扫描base
查看>>
iOS IM开发的一些开源、框架和教程等资料
查看>>
FansUnion:共同写博客计划终究还是“流产”了
查看>>
python 二维字典
查看>>
pip 警告!The default format will switch to columns in the future
查看>>
Arrays类学习笔记
查看>>
实验吧之【天下武功唯快不破】
查看>>
2019-3-25多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)...
查看>>
win7-64 mysql的安装
查看>>
dcm4chee 修改默认(0002,0013) ImplementationVersionName
查看>>
maven3在eclipse3.4.2中创建java web项目
查看>>
发布时间 sql语句
查看>>
黑马程序员 ExecuteReader执行查询
查看>>
记一些从数学和程序设计中体会到的思想
查看>>
题目1462:两船载物问题
查看>>
POJ 2378 Tree Cutting(树形DP,水)
查看>>