博弈
EaShion1994
这个作者很懒,什么都没留下…
展开
-
HDU_1730 Northcott Game(博弈)
题目请点我 题解: 这是一道变形的Nim博弈问题,将每次两棋子中间相差的格数当作一堆棋子,谁取走最后一个(留给对方一个必败态),谁就获胜。转换为了Nim问题,最后直接套公式就好了。 代码实现:#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #define MAX 1010using name原创 2015-08-10 15:02:37 · 503 阅读 · 0 评论 -
HDU_1850 Being a Good Boy in Spring Festival(Nim)
题目请点我 题解: 这道题是Nim的变形,要求求出有多少种必胜的策略。当状态为奇异状态时有等式:a0^a1^a2…..^an=0.则我们要求的就是有多少种可能使经过一次变换得到奇异状态。又有等式a^b^(a^b)=0,则若当前状态是a^b^c^=0时,若c>(a^b),则我们就可以经过一次操作得到奇异状态。同理,多个变量也是一样,我们挨个比较就好了。设a0^a1^a2…..^an=res,则ai原创 2015-08-16 22:38:04 · 468 阅读 · 0 评论 -
HDU_1536 S-Nim(SG函数)
题目请点我 题解: 做的第一道SG函数的模板题,体会到了SG函数的强大之处。利用有向图来理解还是比较好理解的,每一堆都等价为一个Nim游戏,结果取异或。SG函数的求值看到两种方法,一种是递归,另外一种是dp,觉得递归更方便一点。 代码实现:#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #i原创 2015-08-16 11:49:49 · 440 阅读 · 0 评论 -
HDU_1847 Good Luck in CET-4 Everybody!(SG函数)
题目请点我 题解: SG裸题,这道题用dp先打表预处理就会比较方便。 代码实现:#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <set> #define MAX 1024using namespace std;int N; int A[10]; int grundy[MA原创 2015-08-16 14:28:09 · 468 阅读 · 0 评论 -
POJ_2505 A multiplication game(博弈,range)
题目请点我 题解: 这道题是遇到的第一道相乘的题目,考虑的是谁能先大于等于N。对于这类题目,我觉得不太容易像Nim游戏一样找到一个平衡状态。从必胜态和必败态去考虑,我们转化为一个找每个人必能达到的范围的问题。首先,对于先手来说,2~9为必胜区间,不管先手如何,后手所能达到的最小值是18,所以后手的必胜区间是10~18。之后依次类推,每次在考虑临界值的时候,每个人都是希望自己能更大,而对手是希望更原创 2015-08-21 16:41:46 · 637 阅读 · 0 评论 -
POJ_1067 取石子游戏(Wythoff Game)
题目请点我 题解: 其实就是裸的威佐夫博弈,只需要记住公式a=[j(1+√5)/2],b = a+j 就好了。注意最后取整要进行的强制转换。 代码实现:#include <iostream> #include <math.h>using namespace std;int a,b; int main() { double tmp = (sqrt(5.0)+1)/2; while原创 2015-08-21 17:26:26 · 560 阅读 · 0 评论 -
POJ_2975 Nim(Nim)
题目请点我 题解: 题目还是经典的Nim游戏,但是结果要输出所有可能的“winning move”.Nim游戏终究还是二进制异或的问题。先考虑输赢,如果异或结果等于0,则必败。当异或结果不等于0,一种情况为结果等于2^x,也就是说某位上奇数个1,所以我们拿走任意一个都可以;另一种情况结果!=2^x,所以存在多个位上有奇数个1,解决方案是拆掉最高位1,使其他位满足有偶数个1,只有一种解法。所以关键原创 2015-08-21 15:38:35 · 727 阅读 · 0 评论