博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1847 [Good Luck in CET-4 Everybody!] 博弈
阅读量:4319 次
发布时间:2019-06-06

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

题目大意:两个人取n张牌,每次只能取1,2,4等2的幂次张,取完最后一张的获胜。问先手必胜吗?

关键思想:有求SG值的方法,或者找规律的方法,仅贴代码不做讲述,到处都有。了解基础博弈论的话很容易理解。

代码如下:

SG值——

#include 
#include
#include
using namespace std;int sg[1005];int vis[1005];int main(){ int n; sg[1] = 1; sg[2] = 2; for(int i = 3; i <= 1000; i ++){ memset(vis, 0, sizeof(vis)); for(int j = 1; j <= i; j *= 2){ vis[sg[i-j]] = 1; // i-j为后继状态,vis[sg[i-j]]收录S集合 } for(int j = 0; ; j ++){ if(vis[j] == 0){ sg[i] = j; break; // 求没有出现在集合中的非负最小值 } } //cout << sg[i] << endl; } // for(int i = 1; i <= 100; i ++) // cout << sg[i] << endl; while(scanf("%d", &n) != EOF){ if(sg[n] == 0) printf("Cici\n"); else printf("Kiki\n"); } return 0;}

 

总结规律——容易发现3是必败点,而任何一个“非3的倍数”数-1或者-2都能成为3的倍数,所以3的倍数其实都是必败点。其他点则为必胜点。(先手)

#include 
using namespace std;int main(){ int n; while(cin>>n){ if(n%3==0)cout<<"Cici"<

 

转载于:https://www.cnblogs.com/G-M-WuJieMatrix/p/7271721.html

你可能感兴趣的文章
如何获取网站icon
查看>>
几种排序写法
查看>>
java 多线程的应用场景
查看>>
dell support
查看>>
转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决...
查看>>
MTK android 设置里 "关于手机" 信息参数修改
查看>>
单变量微积分笔记6——线性近似和二阶近似
查看>>
补几天前的读书笔记
查看>>
HDU 1829/POJ 2492 A Bug's Life
查看>>
CKplayer:视频推荐和分享插件设置
查看>>
CentOS系统将UTC时间修改为CST时间
查看>>
redis常见面试题
查看>>
导航控制器的出栈
查看>>
玩转CSS3,嗨翻WEB前端,CSS3伪类元素详解/深入浅出[原创][5+3时代]
查看>>
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
查看>>
Delphi消息小记
查看>>
HNOI2016
查看>>
JVM介绍
查看>>
将PHP数组输出为HTML表格
查看>>
Java中的线程Thread方法之---suspend()和resume() 分类: ...
查看>>