随笔分类 - ACM / 数论 博弈论
摘要:原题链接 考察:博弈论 完全给我WA麻了,没有特判4这个点,结果是一直WA. 思路: 3种情况: n为奇数,只有一种取法 n为偶数且n/2也为偶数,此时和奇数一样取 n为偶数且n/2为奇数,直接取一半. 当n==4这个点一定要特判 ##Code #include <iostream> #includ
阅读全文
摘要:原题链接 考察:博弈论 又到了我最喜欢的死活推不出规律的环节(. 思路: 对于n个石子堆,假定堆最大值为maxn,和为sum,如果maxn>sum-maxn那么先手必胜(先手一直取maxn堆即可). 但是如果maxn<=sum-maxn,选手就需要避免出现操作后maxn>sum-maxn的情况,此时
阅读全文
摘要:原题链接 考察:博弈论 思路有点跳跃,反正我是没想到() 思路: 我们发现操作1:石子数-1. 操作2:堆数-1.每次操作都变化的堆数+石子数的和的奇偶性.而堆数+石子数-1 = 能操作的最大次数. 再发现当堆数 = 1,石子数 = 1是必经局面,先手必胜.堆数+石子数-1为奇.如果某个局面先手必胜
阅读全文
摘要:原题链接 考察:博弈论 思路: 这道题像上题一样解释阶梯博弈会发现行不通,因为0位置可以被多个点占据,而上题所有位置都是一个棋子. 那么怎么解呢?博弈论的快速解法就是去找必败态.我们可以发现: 先手只能移动一组里左边的石子,如果k在组里的第二个,那么先手必败. 如果k在组里的第一个呢? 接下来讨论n
阅读全文
摘要:原题链接 考察:博弈论 思路: 看了大佬题解才发现是阶梯博弈,这里讲一下为什么是阶梯博弈. 以第二个样例: 1 5 6 7 9 12 14 17 我们计算出每个人可以移动的距离数组b:0 3 0 0 1 2 1 2 假设我们把第二个人往左移动2格,该数列变成:0 1 2 0 1 2 1 2 有没有发
阅读全文
摘要:原题链接 考察:博弈论 思路: 威佐夫博弈,求先手必胜的第一步. 要先手必胜,即把后手面临的局面改为先手必败.当n==(m-n)*k即先手必败.这里分两种情况: (m-n)*kd,d<n时,我们可以从n堆里取,但我们需要保证新局面下m,与n的差值不变,才能保证差值*kn 从m堆里取,此时m堆的值不可
阅读全文
摘要:原题链接 考察:博弈论 参考大佬的对称博弈,本蒟蒻是没推出来. 思路: 先来看没有成环的情况. n为奇,先手去掉中间的石子,随后后手不管选什么都破坏平衡,先手对称选哪些,因此平衡局面0 0必然被先手遇到. n为偶,先手去掉中间两个石子,随后又形成了平衡局面.由上面先手又必胜.但是如果k==1,则先手
阅读全文
摘要:原题链接 考察:博弈论 思路: 这题不会只能说明对sg函数理解不够透彻了(比如我. 明确sg函数是解决所有ICG游戏的通解,而本题很明显是ICG游戏(所有执行步骤与执行者无关). 那么所有面朝上的硬币都可以视为一个起点.以下标为0的面朝上硬币为例,那么sg(0) = 1.由此也可以推到sg(1) =
阅读全文
摘要:原题链接 考察:博弈论 思路: 发现这种n比较大的,比较难找胜态和败态.像上题一样考虑sg函数打表,但是本题的石子移动是可以移动到其他堆的,本蒟蒻是不会写本题的sg函数(). 这样只能研究A,B的移动方式了,实际有点类似阶梯博弈,可以发现(A+B)%6==3时可以移动A >B.此时枚举0~5之间的数
阅读全文
摘要:原题链接 考察:博弈论 看了其他题解都是不难发现...,果然是我太弱了(.) 思路: 这题不是打表胜负态,而是打表sg函数.可以发现4个一循环. Code #include <iostream> using namespace std; int n; int main() { int T; scan
阅读全文
摘要:原题链接 考察:博弈论 思路: sg函数打表找规律,发现n%(p+q)后,若1<=n<=p则必败. 想说一下的就是,sg函数的必败点不能定义为>0的数.这样会让某些必胜点sg(x)>0被判断必败. Code #include <iostream> #include <cstring> #includ
阅读全文
摘要:原题链接 考察:博弈论 思路: 每次可以选择两个方向,往正方向走,如果0在偶数个位置必胜.往反方向走,如果0在离n+1的距离有偶数个距离也必胜. ##Code #include <iostream> #include <algorithm> using namespace std; const in
阅读全文
摘要:原题链接 考察:博弈论(找规律) 思路: 可以想到dfs奇偶剪枝那道题,每次移动都会改变奇偶性,我们看最后一步是奇还是偶即可. 1 #include <iostream> 2 using namespace std; 3 int n; 4 int main() 5 { 6 while(scanf("
阅读全文
摘要:原题链接 考察:博弈论 找规律 思路: 数字太大了,sg函数求不出来,因此只能先打表找规律(然后什么都没看出来) 看了网上的题解才懂怎么找...= = 先分类几种情况: a%b==0,先手必胜 a>b&&b<a<2b. 此时难以直接判定胜负,需要模拟,此时a只有一种选择.达到判定条件退出. a>2*
阅读全文
摘要:原题链接 考察:博弈论 思路一: dfs记忆化搜索,枚举当前结点能到的每一个点.sg函数记录不能到达的点. 当sg函数>0,说明有操作时当前点到达0点.此时先手为胜. 思路二: 上面的思路数据稍微小点,就会报错... 找规律.观察操作,每次操作使日期的奇偶性改变.终点的日期之和(不考虑年)为偶数,所
阅读全文
摘要:原题链接 思路: 直接dfs会MLE,需要打表,根据行列奇偶性判断是否能胜,由打表得当n%2==1&&m%2==1时必败. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int n,m; 5 int main(
阅读全文
摘要:原题链接 考察:博弈论 思路: 当往上走不能再前进时sg(x,y) = 0.在sg函数里模拟行走,记录sg函数的值.最后结果是n个骑士坐标异或 1 #include <iostream> 2 #include <cstdio> 3 #include <set> 4 #include <cstring
阅读全文