hdu 1729 Stone Game 博弈论】的更多相关文章

那么对于这题对于每一堆,放石子放满就想当于满的时候取s-c个,反向只是让我理解题意更深. 首先我们知道(S,S)这个局面是必败局面.对于每一堆能加的数量有限,而当c的值(大于或者等于) D=sqrt(s) 或者 D=sqri(s)+1的时候就可以一次完成,就是说可以从当前局面到达(S,S)的局面, 所以当前局面是必胜局面.而这种情况下,你能造成的局面有集合A={0,1,2,...,s-c-1}:因为你可以去 s-c,s-c-1,s-c-2,.....,1:那么对应mex(x)函数(即A中未出现的…
Stone Game HDU - 1729 题意: 给定n个箱子,每个箱子的容量为si,每个箱子里最初有ci个石子,每次放入石子不能超过放入前的石子数的平方,谁无法继续放入石子就算输.   /* 这是个SG函数的基础题?并不是的吧.. 求一个t使t+t*t=si,那么 1.当ci>t时,是必胜态,可以一次性放满箱子,即(si,si). 2.当ci==t时,即便只放一个,下一个状态t+1+(t+1)*(t+1)一定能放满箱子必胜,所以ci==t这个状态必败. 3.当ci=si-t,同样的方法判断必…
以下转载至:长春理工大学赵小舟博弈论ppt 题目大意: 1.有n个盒子,每个盒子都有它的容量s 2.在游戏开始时,每个盒子里都有一些石子 3.双方轮流进行游戏,向一个盒子投入n个石子,其中n不能大于当前盒子中石子数量的平方,投入后盒中石子数不能超过其容量 例:如果现在盒中有3个石子,则可以向里投1-9个 4.谁不能向任何盒中投石子为负 给出n个盒子的初态, 问在双方均为最优策略时先手者是否能取胜 思路: s=20的情况(k代表题目中的c) 规律:k(k+1)<s时k的最大值为sg=0的一点,其后…
题意: 有n个盒子,每个盒子可以放一定量的石头,盒子中可能已经有了部分石头.假设石头无限,每次可以往任意一个盒子中放石头,可以加的数量不得超过该盒中已有石头数量的平方k^2,即至少放1个,至多放k^2个. 思路: 跟常规nim的区别就是加了个限制“每次加的量不超平方”.盒子容量上限是100万,那么就不能直接计算SG了,会超时.sg打表后找规律.根据剩下多少个空位来决定sg值.都是0123456这样子递增的,碰到不能一次加满就变为0,然后继续递增,一直这样. 我的方案是,对于每个盒子大小,找到除了…
每次有n个盒子,每个盒子有容量上限,每次操作可以放入石头,数量为不超过当前盒子中数量的平方,不能操作者输. 一个盒子算一个子游戏. 对于一个盒子其容量为s,当前石子数为x,那么如果有a满足 $a \times a + a < s     \land   (a+1) + (a+1)^2 >= s$,那么可知此时的sg(s,a)为0,为终止态,如果此时x > a,那么直接结束了,后继局面数为s-x,而如果x<=a,则以此时的a作为下一终止的目标,递归求sg值. 最后SG和就好了. /*…
HDU.2149 Public Sale (博弈论 巴什博弈) 题意分析 巴什博奕裸题 博弈论快速入门 代码总览 #include <bits/stdc++.h> using namespace std; int main() { int n,m,s,r; while(scanf("%d %d",&m,&n) != EOF){ s = m%(n+1); if(s == 0) printf("none\n"); else{ r = (m -…
HDU.1846 Brave Game (博弈论 巴什博弈) 题意分析 巴什博奕裸题 博弈论快速入门 代码总览 include <bits/stdc++.h> using namespace std; int main() { int t; scanf("%d",&t); while(t--){ int n,m; scanf("%d %d",&n,&m); int r,s; r = n%(m+1); if(r == 0) prin…
[Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论) 题面 有n堆石子,两个人轮流取石子,一次只能从某堆里取一颗.如果某个人取的时候已经没有石子,或者取完后又两堆石子个数相同(个数为0也算).假如两人都足够聪明,问谁能赢. 分析 贪心考虑,最后局面一定是0~n-1的一个排列.这时谁取谁就输.因此我把a[i]从小到大排序,把a[i]变成i-1,可以计算出取的石子个数\(\sum (a_i-i+1)\),如果是奇数,则先手胜,否则后手胜. 但…
http://acm.hdu.edu.cn/showproblem.php?pid=4388 http://blog.csdn.net/y1196645376/article/details/52143551 好久没有写题了,再这么颓下去就要被彻底踩爆了(已经被彻底踩爆了). 这道题是一道博弈论,从侧面向我们揭示了一个客观规律,取东西的博弈论(不是定理的话)大多数都是从二进制入手(虽然这道题题目很显然是和二进制有关)进行一系列的找规律. 这道题的正解也同样给了我们一种看题的思路,从最基本的条件看…
SG函数应用!! 代码如下: #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> using namespace std; ],a[],n; int get_sg(int m) { ) return sg[m]; ]; memset(vis,,sizeof(vis)); ;i<n&&a[i]<…
思路: 这就是K倍动态减法游戏,可以参考曹钦翔从“k倍动态减法游戏”出发探究一类组合游戏问题的论文. 首先k=1的时候,必败态是2^i,因为我们把数二进制分解后,拿掉最后一个1,那么会导致对方永远也取不完,我们可以拿到最后一个1. k=2的时候,必败态是斐波那契数列,因为任何一个整数n都可以写成两项斐波那契数的和,所以我们拿掉1,对方永远取不完高两位的数. k的时候我们必须构造数列,将n写成数列中一些项的和,使得这些被取到的项的相邻两个倍数差距>k 那么每次去掉最后一个1 还是符合上面的条件.设…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729 看了题目感觉像Nim,但是有范围限制,有点不知道SG函数该怎么写 看了题解,最后才明白该怎么去理解 . 首先进行对s和c进行分类, 1.c = 0 的时候,无论怎样都填不满,直接跳过: 2.c = s 的时候,先手必败,即是P态: 3.c < s 的时候,可以分为两种情况: 1)c^2 + c < s 的时候,递归 2)c^2 + c > s 的时候,先手必胜,即N态 int mex(…
朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Description B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的:给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双方轮流进行 操作.当一方操作时,他们需要先选择一个不为根的点,满足该点到其父亲的边权为1; 然…
Circles Game 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5299 Description There are n circles on a infinitely large table.With every two circle, either one contains another or isolates from the other.They are never crossed nor tangent. Alice and…
Stone Game II HDU - 4388 题目大意: 给出n堆物品,每堆物品都有若干件,现在A和B进行游戏,每人每轮操作一次,按照如下规则: 1. 任意选择一个堆,假设该堆有x个物品,从中选择k个,要保证0<k<x且0<(x^k)<k. 2. 再增加一个大小为x^k的堆(也就相当于将一个x个物品的堆变成一个k个物品的堆和一个x^k个物品的堆),另外有一个技能,可以将这个大小为x^k的堆变成(2*k)^x的堆,但是这个技能每个人只有一次机会可以使用. 现在问两人轮流操作,都采…
很简单的博弈论问题,可以转化为Nim 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include<iomanip> #include<cmath> #include<cstring> #include<vector> #define ll __int64 #define pi acos(-1.0) #define MAX 50000 usi…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4764 题目大意:Tang和Jiang玩石子游戏,给定n个石子,每次取[1,k]个石子,最先取完的人失败,Tang先取,求博弈. Sample Input 1 1 30 3 10 2 0 0   Sample Output Jiang Tang Jiang 分析:可以看成是谁先取完n-1个石子,谁获胜,则变成完完全全的巴什博弈,当然要考虑特殊情况. 代码如下: #include<iostream>…
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5724 [题目大意] 给出一个n行,每行有20格的棋盘,棋盘上有一些棋子,每次操作可以选择其中一个棋子,将其移至最左端的空位,两个人轮流操作,无法操作者输,判断游戏胜负. [题解] 首先对于单行20格的游戏,这是一个NIM游戏,将20格的情况状态压缩,对于每种情况递归求其mex集合,计算其sg值,sg值为0的状态为必败态. 而对于可以拆分为多组NIM游戏的游戏,其sg值为拆分出的多组游戏的sg值的…
A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 一开始一直在想游戏怎么会结束...眼残没发现$i<j.....$ 然后,解这类组合游戏问题重要的一步是发现独立的子游戏 本题中每个石子是互不影响的 $sg[i]$为一颗在$i$的石子的状态 $sg[i]=mex\{sg[j] \oplus sg[k]\}$ 然后就$\oplus$起来就行了 #incl…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4764 题意:Tang 和 Jiang 玩一个游戏,轮流写下一个数,Tang先手,第一次Tang只能写[1,k]之间的数,X表示上一个人写的数,Y表示下一个人写的数,每次必须满足 1<=Y-X<=k,直到有一个人写下的数不小于n,写下那个数的人失败,游戏结束,输出胜利的人. 分析:可以看做是取石子游戏,有一堆n-1个的石子,两个人轮流去石子,每次最多能去k个,如果没有石子可取则输,这就将问题转化为巴…
Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 179    Accepted Submission(s): 137 Problem Description Tang and Jiang are good friends. To decide whose treat it is for dinner, they are pla…
http://acm.hdu.edu.cn/showproblem.php?pid=3404 题目 http://www.doc88.com/p-5098170314707.html 论文 nim积在22页附近 http://blog.csdn.net/kele52he/article/details/77099890 抄的代码的来源 根据论文相关部分和自己的理解的介绍.(nim积其实没什么卵用,学这种毒瘤的都有猫病.) nim和其实就是异或,想一下之前sg函数或者nim游戏结算的时候,是几堆在…
Stone Game II comes. It needs two players to play this game. There are some piles of stones on the desk at the beginning. Two players move the stones in turn. At each step of the game the player should do the following operations.   First, choose a p…
Stone Game II Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 531    Accepted Submission(s): 300 Problem Description Stone Game II comes. It needs two players to play this game. There are some p…
点击打开题目链接 之前没做过这题,因为学弟问到我如果来求该题的sg值,才做了这题. 首先, 是多堆Nim博弈毫无疑问,这题是往一个有固定容量的箱子里放石子,和从一堆石子里面拿出石子是一个道理. 和传统的Nim稍有不同的地方是:The number mustn’t be great than the square of the number of stones before the player adds the stones. 也就是说,往箱子里放石子的数量应该在1... c^2,当然也应该使放…
题目:传送门. 题意:长度为N的格子,Alice和Bob各占了最左边以及最右边K个格子,每回合每人可以选择一个棋子往对面最近的一个空格移动.最先不能移动的人获得胜利. 题解: k=1时 很容易看出,n为奇数则后手获胜,n为偶数则先手获胜 k>1时 如果n=2*k+1,则棋 盘中只有一个空白的格子,每次移动必须移动到当前的空白格子上.先手方可以先随意选择一颗棋子占据中间的位置,然后双方互有移动,移动过程中双方肯定都会 选择一颗在己方半场的棋子移动到对方半场里.直到后手方还剩下一颗己方半场的棋子时,…
SG函数打表,求NIM和!!! 代码如下: #include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> using namespace std; ][]; ]; void init() { int i,j,a,b,k; ]; ;i<=;i++){ sg[i][]=sg[][i]=i; } ;i<=;i++) ;j&l…
主要是求NIM积!!! 代码如下: #include<iostream> #include<cstdio> #include<stack> #include<cstring> #define ll __int64 using namespace std; ][]; int nim(int x,int y); int _nim(int x,int y){ <<x+y; int &F=f[x][y]; )return F; ,e=; ;i&l…
今天(2013/9/28)长春站,最后一场网络赛! 3~5分钟后有队伍率先发现伪装了的签到题(博弈) 思路: 与取石头的巴什博弈对比 题目要求第一个人取数字在[1,k]间的某数x,后手取x加[1,k]内的某数. 将输入的n看做n个石头并编号,后一次取得的是[1,k]中的石头编号. #include<stdio.h> int main() { int n,k; while(scanf("%d%d",&n,&k)!=EOF) { &&k==)br…
思路: 如果负数的个数为偶数则不必改变,为奇数就将最大负数变为正: 对于正数,尽量将1,2变为3即可. 代码如下: #include<cstring> #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #include<map> #include<vector> #include<…