
数学-博弈论
JeraKrs
本人目前就职于百度商业研发部,有需要内推的朋友简历可发我邮箱 jerakrs@qq.com
展开
-
hdu 4764 Stone(博弈)
题目连接:hdu 4764 Stone题目大意:有两个人,Tang和Jiang,玩一个游戏,给出n和m,然后从Tang开始报数,每次最多报m个数,然后一个人报完后换另一个人报,但是报的数要接着前一个(比如T报了1,2,那么J就得从3开始报)然后谁报到n就算输,输出胜利者的名字。解题思路:判断(n-1)%(m+1)是否为0即可。因为不管第一个人报多少,第二个人始终可以将每一轮原创 2014-03-09 20:29:52 · 1170 阅读 · 0 评论 -
uva 1567 - A simple stone game(K倍动态减法游戏)
题目链接:uva 1567 - A simple stone game题目大意:给定K和N,表示一堆石子有N个,先手第一次可以取1~N-1个石子,取到最后一个石子的人胜利,单词每次操作时,取的石子数不能超过对手上一次取的石子数m的K倍。问先手是否可以必胜,可以输出最小的首次操作。解题思路:这题想了一天,又是打表找规律,又是推公式的,楞是做不出来,后来在网上找到了一篇题解,将的很清楚原创 2014-08-09 09:45:32 · 2157 阅读 · 0 评论 -
uva 1378 - A Funny Stone Game(组合游戏)
题目链接:uva 1378 - A Funny Stone Game题目大意;两个人玩游戏,对于一个序列,轮流操作,每次选中序列中的i,j,k三个位置要求ij≤k,然后arr[i]减1,相应的arr[j]和arr[k]加1,不能操作的人输,问先手是否必胜,必胜的话给出字典序最下的必胜方案,负责输出-1.解题思路:首先预处理出各个位置上的SG值,然后对于给定序列,枚举位置转移状态后判原创 2014-08-08 21:27:51 · 1382 阅读 · 0 评论 -
hdu 2147 kiki's game(博弈)
题目链接:hdu 2147 kiki's game题目大意:略。解题思路:当n和m均为奇数是必败。#include int main () { int n, m; while (scanf("%d%d", &n, &m) == 2 && n + m) { printf("%s\n", (n&1) && (m&1) ? "What a pity!原创 2014-08-09 23:09:59 · 776 阅读 · 0 评论 -
hdu 2176 取(m堆)石子游戏(组合游戏)
题目链接:hdu 2176 取(m堆)石子游戏题目大意:略。解题思路:Num和性质。#include #include #include using namespace std;const int maxn = 200005;int n, sg, arr[maxn];int main () { while (scanf("%d", &n) == 1原创 2014-08-09 18:04:15 · 721 阅读 · 1 评论 -
hdu 2516 取石子游戏(组合游戏)
题目连接:hdu 2516 取石子游戏题目大意:略。解题思路:K倍动态减法,K=2的情况为斐波那契数列。#include #include #include using namespace std;typedef long long ll;int n;ll k, fbi[50];bool judge () { for (int i = 0; i <原创 2014-08-09 18:06:15 · 853 阅读 · 0 评论 -
hdu 1850 Being a Good Boy in Spring Festival(组合游戏)
题目连接:hdu 1850 Being a Good Boy in Spring Festival题目大意:略。解题思路:Nim和判断是否必胜。/***************** * * sg 为0时,有arr[i] ^ sg == arr[i],所以arr[i] > arr[i] ^ sg;*****************/#include #include原创 2014-08-09 18:00:31 · 750 阅读 · 0 评论 -
uva 12033 - Game of CS(树形删边)
题目链接:uva 12033 - Game of CS题目大意:给定图,以0为根节点,每条边有一个长度,两个人轮流操作,每次为一条边上色,上一个单位长度,当一条边的颜色被涂满,则算作是减掉整段子树。判断先手是否必胜。解题思路:SG定理,对于当前节点u,每次考虑字节点v,u-v边的长度为l当l为1时:sg(u) ^= (sg(v) + 1)当l为奇数时: 需要判断sg(v原创 2014-08-09 23:18:02 · 1356 阅读 · 2 评论 -
Codeforces 455B A Lot of Games(字典树+博弈)
题目连接: Codeforces 455B A Lot of Games题目大意:给定n,表示字符串集合。给定k,表示进行了k次游戏,然后是n个字符串。每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为集合中某字符串的前缀,不能操作者输,新一轮由上一句输的人先手。解题思路:首先对字符集合建立字典树,然后根据博弈的必胜必败性质搜索出先手的决策状态,可决定胜败3,只能原创 2014-08-09 11:55:02 · 2103 阅读 · 6 评论 -
hdu 1527 取石子游戏(组合游戏)
题目连接:hdu 1527 取石子游戏题目大意:略。解题思路:威佐夫博弈.#include #include #include #include using namespace std;int main () { int a, b; while (scanf("%d%d", &a, &b) == 2) { if (a > b)原创 2014-08-09 17:56:57 · 734 阅读 · 0 评论 -
hdu 2509 Be the Winner(博弈)
题目链接 :hdu 2509 Be the Winner题目大意:给定n堆苹果的个数,两人轮流操作,每次操作从一堆苹果中取若干苹果,取到最后一个苹果的人位输解题思路:反Nim游戏。#include #include #include using namespace std;const int maxn = 50;int main () { int ret原创 2014-08-18 21:15:58 · 791 阅读 · 0 评论 -
hdu 4994 Revenge of Nim(博弈)
题目链接:hdu 4994 Revenge of Nim题目大意:有n堆石子,每次可以从开头的那堆石子中取走若干个石子,两人轮流取,取走最后一个石子的人获胜。解题思路:考虑开头连续1的个数,不包括最后一堆。#include #include #include using namespace std;const int maxn = 1005;int n, arr[原创 2014-09-14 10:15:49 · 747 阅读 · 0 评论 -
hdu 5011 Game(博弈)
题目链接:hdu 5011 Game题目大意:n堆石子,两人轮流取,每次取完可以将剩下的石子分成若干份。取到最后一个石子的人胜利。解题思路:Nim和为0则为N态,否则为P态。#include #include #include using namespace std;typedef long long ll;int main () { int n;原创 2014-09-15 19:17:40 · 708 阅读 · 0 评论 -
hdu 4111 Alice and Bob(博弈)
题目链接:hdu 4111 Alice and Bob题目大意;Alice和Bob两个玩游戏,有N堆石子,每次可以从一堆中取走一个石子,或者是合并两堆石子,Alice先,问说最后谁赢。解题思路:NP定理,写出一些NP定理找到规律,再用归纳的方法证明。统计1的个数c,以及非1情况下的步数s,包括合并。c为奇数,s不等于2:那么先手必胜。s为2或者为0:c为原创 2014-11-09 19:45:42 · 1696 阅读 · 0 评论 -
hdu 4664 Triangulation(博弈)
题目链接:hdu 4664 Triangulation解题思路根据SG定理打个表,SG值最多为9,前几项在SG值不全的时候没有规律,但是当SG值为9的出现后,以34为一循环。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int sg[] = {0, 0, 1, 1, 2,原创 2015-11-06 21:37:26 · 703 阅读 · 0 评论 -
hdu 4672 Present Day, Present Time(博弈)
题目链接:hdu 4672 Present Day, Present Time解题思路这题数据有点水。代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 100005;const int maxm = 105;int N, M, T, dp[maxn], A原创 2015-11-06 21:51:06 · 1324 阅读 · 0 评论 -
hdu 4678 Mine(bfs+博弈)
题目链接:hdu 4678 Mine解题思路点击一个空白点后显示出的所有位置当作一个块,每个块可以当成一个子游戏,子游戏的SG和边有带数字点的个数有关,奇数时为2,偶数时为1。对于没有靠近空白块的点,本身就是一个子游戏,SG为1代码#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <alg原创 2015-11-09 20:28:21 · 729 阅读 · 0 评论 -
uva 1500 - Alice and Bob(推理)
题目连接:uva 1500 - Alice and Bob题目大意:在黑板上又一个序列,每次操作可以选择一个数减1,或者是合并两个数,一个数被减至1则自动消除,不能操作者输。解题思路:结论,对于大于1的数可以看成是一个整数s,为消除他们的总操作步数,包括减1以及合并,c为列中1的个数,如果s>2的话,c或者是s为奇数则为必胜,否则必败。若s≤2的话(s=2或者s=0)是,判断c是否原创 2014-08-08 22:25:44 · 1693 阅读 · 0 评论 -
uva 1561 - Cycle Game(推理)
题目链接:uva 1561 - Cycle Game题目大意:给出一个环,每次从起点开始,可以选择一个权值非0的边移动,移动后减掉权值至少1点。不能移动的为失败。解题思路:1:有0的情况,如果有方向离权值为0的边的步数为奇数,则为必胜;否则必败;2:无0的情况,奇数边必胜;3:有1的情况,同0的判断一样;4:无1的情况,只剩偶数边的情况,必败;#include #in原创 2014-08-09 03:13:25 · 1428 阅读 · 0 评论 -
uva 12163 - Addition-Subtraction Game(组合游戏)
题目链接:uva 12163 - Addition-Subtraction Game题目大意:两个人进行游戏,对于每一局有一个无向图,给出无向图,每个节点有个K值,两人轮流操作,每次可以选中国一个含有石子的节点,将该节点的一个石子拿掉,然后选择K个有边连接的节点加上一个石子(节点可以重复选择),每个节点的子节点不会超过15个。不能操作的人视为失败。每局有n轮,给定每轮中每个节点上石子的初始原创 2014-08-08 21:22:31 · 1389 阅读 · 0 评论 -
poj 1740 A New Stone Game(博弈)
题目链接:poj 1740 A New Stone Game题目大意:就是有n堆旗子,给出每堆旗子的个数,现在由两个人来进行游戏,当前操作的人要选中一堆旗子,然后拿走其中至少一个旗子,并且可以选择将若干的旗子查到1或多的其他旗堆中;如果有一方没有旗子可以拿,则算输,问说先拿个人是赢还是输。解题思路:判断旗子的个数是否成对,如果成对的话,第一个如果操作,第二个人可以仿照第原创 2014-04-11 23:06:16 · 1330 阅读 · 0 评论 -
uva 10368 - Euclid's Game(博弈)
题目链接:uva 10368 - Euclid's Game题目大意:给出两个数,两个人做一个游戏,每次有stan开始操作,每次操作可以从最大的数中取走若干个小的数,即a-kb,a为比较大的数,b为比较小的数,kb为取走的值,k必须为整数,并且kb≤a。如果不能顺利执行操作,则对手胜利。解题思路:模拟,直到k的最大值不为1时,当前操作者就掌握了主动权,既可以获胜。特殊情况为a=b的原创 2014-07-02 19:56:10 · 1701 阅读 · 0 评论 -
uva 1559 - Nim(记忆化+博弈)
题目链接:uva 1559 - Nim题目大意:有n个人,奇数的为一队,偶数的为一对,两队分别从一堆石子个数为S的石子堆中取石子,取到最后一个石子一方则视为失败。给出各个队员每次可取石子的上限值,然后按照顺序操作。解题思路:dp[i][s]表示第i个选手操作时剩s个石子时为必胜还是必败。因为是取到最后一个石子的为输,所以最后递归结束的条件和不同的略有不同。还尝试过可以将石子数减原创 2014-08-07 11:08:02 · 972 阅读 · 0 评论 -
uva 11927 - Games Are Important(组合游戏+记忆化)
题目链接:uva 11927 - Games Are Important题目大意:给出一张无环有向图,并给出每个节点上的石子数,每次操作可以选择一个石子,向下一个节点移动。两人轮流操作,直到不能操作为失败者。解题思路:有了图之后,用记忆化的方式处理出每个节点的SG值,取所有石子数为奇数的节点的Nim和。#include #include #include using n原创 2014-08-06 23:09:41 · 1106 阅读 · 0 评论 -
uva 12293 - Box Game(组合游戏)
题目链接:uva 12293 - Box Game题目大意:有两个盒子,第一个盒子装有n个球,第二个盒子装又1个球,每次操作将少的盒子中的球全部拿掉,并从另一个盒子中取一些球放入该盒子,不能使另一个盒子中球的个数为0。两人轮流操作,问说最后谁胜。解题思路:n如果为2i−1那么先手必败。#include #include #include using namespace原创 2014-08-06 23:03:05 · 1276 阅读 · 0 评论 -
uva 1558 - Number Game(状态压缩)
题目连接:uva 1558 - Number Game题目大意:给定一些数,每次操作选取一个数x,然后剔除里面所有x的倍数,a+x的倍数(a为前面操作中剔除的数),最后不能操作的人为输。解题思路:这题写的很乱,主要就是用一个二进制数表示有哪些数是还可以选的。#include #include #include using namespace std;const int原创 2014-08-06 23:43:10 · 836 阅读 · 0 评论 -
uva 1482 - Playing With Stones(Nim游戏)
题目链接: uva 1482 - Playing With Stones题目大意:n堆石子,给定每堆石子的个数,两个人分别从操作,每次可以从一堆中取走至少一个石子,但是不能超过一半。如果不能操作则视为失败。解题思路:对于每一堆式子来说,可以看作一个Nim游戏,但是SG(x)并不等于x,因为每次取石子不能超过一半,所以对于偶数SG(x)=x/2,对于奇数SG(x)=SG(x/2).原创 2014-08-05 23:27:20 · 1383 阅读 · 0 评论 -
uva 11534 - Say Goodbye to Tic-Tac-Toe(Nim和)
题目链接:uva 11534 - Say Goodbye to Tic-Tac-Toe题目大意:给定一个1*n的个子,每次操作可以选中一个未填过的个子画X或者O,如果该次操作形成了XX或者OO,那么该次操作者视为失败,人为先手,对于给定状态(注意当前状态也算在步数中),问是否可以战胜电脑。解题思路:对于固定长度,两端的可能有空,X,O,组合情况共有9种,虽然有些情况等价,但是为方便原创 2014-08-06 23:21:28 · 1517 阅读 · 0 评论 -
uva 10561 - Treblecross(Nim)
题目链接:uva 10561 - Treblecross题目大意:n个格子排成一排,其中一些格子有'X',两个游戏者轮流操作,在格子中放X,如果此时出现连续3个X,则获胜。给出先手是否可以取胜,取胜方案的第一步该怎么走。解题思路:一个X可以导致左右两个的两个格子都不能再放X,因为如果出现XX.、.XX、X.X,那么下一个人肯定胜利。所以对于长度为n的格子序列,g(x)=maxg(x原创 2014-08-05 23:38:50 · 1599 阅读 · 0 评论 -
uva 10165 - Stone Game(推理)
题目链接:uva 10165 - Stone Game题目大意:给定n堆石子的个数,两人轮流选择石子堆取石子,直到不能取为失败,附加条件,如果前一次操作,即队手的操作,没有将选中石子堆中的石子取完,那么当前操作者必须在该堆中取石子。解题思路:只要有一个石子堆的个数大于2,那么先手就获得必胜态,可控。对于全是1的情况判断奇偶性。#include #include #inclu原创 2014-08-06 23:14:30 · 1530 阅读 · 0 评论 -
uva 11859 - Division Game(Nim)
题目链接:uva 11859 - Division Game题目大意:给定一个N*M的矩阵,每次可以选择同一行中的若干个数,把它们变成它们的真因子。问说先手的可否胜利。解题思路:将每一行中每个数的质因子看成是一个火柴,那么对于一行来说就是一个单堆的Nim游戏。#include #include #include using namespace std;int div原创 2014-08-06 10:24:36 · 1407 阅读 · 0 评论 -
uva 847 - A Multiplication Game(规律)
题目链接:uva 847 - A Multiplication Game题目大意:给定n,有p=1,每次操作可以给p乘上2~9,两个人人轮流操作,当p>=n时获胜。解题思路:算半个贪心吧,2~9为必胜,10~18为必败,19~162为必胜。。。即每次乘9,如果大于则是Stan胜,再乘2,如果大于则是Oliie#include #include #include usin原创 2014-08-06 23:26:54 · 1359 阅读 · 0 评论 -
uva 1557 - Calendar Game(博弈)
题目链接:uva 1557 - Calendar Game题目大意:给定一个日期,每次可以选择加一个月,或者加一天,加一个月的前提是下一个月有对应的日期,比如1.30加一个月变成2.30是不合法的,日期上限为2001.11.4。两个人轮流操作,不能操作为失败。解题思路:dp[y][m][d]表示对应日期是否为先手必胜。预先处理即可,注意细节,包括闰年等。分享代码。#includ原创 2014-08-06 23:32:11 · 921 阅读 · 0 评论 -
uva 11892 - ENimEN(推理)
题目链接:uva 11892 - ENimEN题目大意:给定n堆石子的个数,两人轮流选择石子堆取石子,直到不能取为失败,附加条件,如果前一次操作,即队手的操作,没有将选中石子堆中的石子取完,那么当前操作者必须在该堆中取石子。解题思路:只要有一个石子堆的个数大于2,那么先手就获得必胜态,可控。对于全是1的情况判断奇偶性。#include #include #include原创 2014-08-07 09:12:55 · 1767 阅读 · 0 评论 -
uva 11249 - Game(组合游戏)
题目链接:uva 11249 - Game题目大意:给定K和N,表示有N轮游戏,每轮游戏给定两堆石子的个数,两人轮流操作,每次操作可以选择一堆取任意数量的石子,也可以选两堆取,要求两堆取的石子数之差的绝对值小于K,不能操作者为输,问先手的胜负情况。解题思路:傻逼先手才一次取完,那样的话对手直接将另一堆取光不就傻逼了。所以先手就有一个取石子的最优策略,当两堆石子的数量差小于等K的时候原创 2014-08-08 21:58:27 · 1189 阅读 · 0 评论 -
uva 1566 - John(Nim)
题目链接:uva 1566 - John题目大意:反Nim游戏,除了取到最后一个石子的为输,其他规则和Nim游戏相同。解题思路:特判全为1的情况,负责答案就是Nim和。#include #include #include using namespace std;const int maxn = 50;int main () { int cas;原创 2014-08-08 22:05:29 · 1100 阅读 · 0 评论 -
hdu 4701 Game(博弈)
题目链接:hdu 4701 Game代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;const int maxn = 1e6 + 5;/* * S(i) 表示第i件物品到第N件物品的价值和 * win(i, x, y) 表示当前可以买的物品原创 2015-11-12 14:47:14 · 824 阅读 · 0 评论