HDU-1847 Good Luck in CET-4 Everybody!-博弈-SG函数
发布日期:2022-02-10 08:11:09 浏览次数:12 分类:技术文章

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

Good Luck in CET-4 Everybody! 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧张得连短学期的ACM都没工夫练习了,反正我知道的Kiki和Cici都是如此。当然,作为在考场浸润了十几载的当代大学生,Kiki和Cici更懂得考前的放松,所谓“张弛有道”就是这个意思。这不,Kiki和Cici在每天晚上休息之前都要玩一会儿扑克牌以放松神经。“升级”?“双扣”?“红五”?还是“斗地主”?当然都不是!那多俗啊~作为计算机学院的学生,Kiki和Cici打牌的时候可没忘记专业,她们打牌的规则是这样的:1、  总共n张牌;2、  双方轮流抓牌;3、  每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…)4、  抓完牌,胜负结果也出来了:最后抓完牌的人为胜者;假设Kiki和Cici都是足够聪明(其实不用假设,哪有不聪明的学生~),并且每次都是Kiki先抓牌,请问谁能赢呢当然,打牌无论谁赢都问题不大,重要的是马上到来的CET-4能有好的状态。Good luck in CET-4 everybody!

Input

输入数据包含多个测试用例,每个测试用例占一行,包含一个整数n(1<=n<=1000)。
Output
如果Kiki能赢的话,请输出“Kiki”,否则请输出“Cici”,每个实例的输出占一行。
Sample Input
1
3
Sample Output
Kiki
Cici
题意:轮流抓牌,每人每次抓牌的个数只能是2的幂次(即:1,2,4,8,16…),最后抓完牌的人为胜者,每次都是Kiki先抓牌,判断谁能赢
解题思路:找规律或利用SG函数,因为找规律的能力因人而异且不同的题有不同的规律,所以这里就介绍无脑用SG函数的方法。
SG函数:

Sprague-Grundy 函数 sg 作用于图 (?, ? ) , 其参数是一个非负整数 ?,

??(?) = ???{? ≥ 0 ∶ ? ≠ ??(?) ??? ? ∈ ? (?)}.
? 的后继者的 Sprague-Grundy 函数值构成一个集合,??(?) 是不属于该集
合的一个最小非负整数。
为方便描述,定义 mex(minimal excludant) 运算,这是施加于一个集合的运
算,表示最小的不属于这个集合的非负整数。例如 mex{0,1,2,4}=3,mex{2,3,5}=0。
上面的定义可以写成:??(?) = ???{??(?) ∶ ? ∈ ? (?).}
依然以取石子博弈为例来计算 ??(?),每次取的石子数只能来自 ? = {1, 2, 3}。
终态顶点 0,sg(0)=mex{}=0; 顶点 1 只能移动到 0,所以
sg(1)=mex{sg(0)} = 1,
sg(2)=mex{sg(0),sg(1)}=2,
sg(3)=mex{sg(0),sg(1),sg(2)}=3,
sg(4) =mex{sg(1),sg(2),sg(3)}=0…
很明显 ??(?) = ?%4。

这是笔者从老师给的资料里粘贴的,我也是今天才学的SG函数,具体证明请麻烦读者自行查找相关资料( ̄ε(# ̄)

AC代码:#include 
#include
#include
#include
#include
using namespace std;#define maxn 1000000007typedef long long ll;int n,a[12],sg[1005],vis[1005];int main(){ for(int i=0;i<12;i++) //保存各种取法 a[i]=pow(2,i); int k; for(int x=0;x<=1000;x++) //x为牌数 { memset(vis,0,(x+1)*sizeof(int)); //赋初值 for(int i=0;i<10;i++) //2^10>1000,所以i只用取到9 { if(a[i]>x) break; vis[sg[x-a[i]]]=1; //标记sg[i]中的元素 } for(k=0;vis[k];k++); //注意有个分号,也就是说结束时vis[k]==0 sg[x]=k; } while(scanf("%d",&n)==1) { if(sg[n]) printf("Kiki\n"); else printf("Cici\n"); } return 0;}

注:若是联合组合博弈,可以利用Sprague-Grundy 定理

回头看 Nim 博弈,设每堆石子数为 ?? ,易知每个子博弈的 SG 函数为

???(??) = ??,所以整个博弈的 sg 函数为:??(?1, ?2, … , ??) = ?1 ⊕ ?2 ⊕ … ⊕ ??
等于0,失败。

笔者刚学的博弈,如果有问题希望大佬们能多加指点(。・∀・)ノ

转载地址:https://blog.csdn.net/qq_44632981/article/details/97621269 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:POJ-2975 Nim ----数学--Nim博弈
下一篇:POJ-3126-Prime Path-素数-BFS

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月17日 06时52分33秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

什么是服务熔断? 2021-06-30
服务器压力过大?CPU打满?我来帮你快速检查Linux服务器性能 2021-06-30
C++面经总结之《Effective C++》(一) 2021-06-30
C++面经总结之《Effective C++》(二) 2021-06-30
这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!! 2021-06-30
打开我的收藏夹 -- Python数据分析杂谈 2021-06-30
上手Pandas,带你玩转数据(1)-- 实例详解pandas数据结构 2021-06-30
上手Pandas,带你玩转数据(2)-- 使用pandas从多种文件中读取数据 2021-06-30
上手Pandas,带你玩转数据(3)-- pandas数据存入文件 2021-06-30
爬虫遇上不让右击、不让F12的网站,该怎么办? 2021-06-30
上手Pandas,带你玩转数据(4)-- 数据清洗 2021-06-30
上手Pandas,带你玩转数据(5)-- 数据转换与数据定位 2021-06-30
上手Pandas,带你玩转数据(6)-- 摆脱对pandas可视化丑图的刻板印象吧 2021-06-30
从零开始,学会Python爬虫不再难!!! -- (1)开篇:初识爬虫,基础铺垫 丨蓄力计划 2021-06-30
从零开始,学会Python爬虫不再难!!! -- (2)承接:解析网页,抓取标签 丨蓄力计划 2021-06-30
AttributeError: module ‘urllib‘ has no attribute ‘quote‘的解决办法 2021-06-30
linux shell — 6.初识 EXT2 文件系统 2019-04-27
Java — String(字符串) 2019-04-27
linux shell — 7.linux 磁盘与文件系统管理 2019-04-27
linux shell — 8.linux 磁盘与文件系统管理(2) 2019-04-27