博弈
YYyyCCCcccBb
觉得为时已晚的时候,恰恰是最早的时候。
展开
-
hdu3980Paint Chain(SG)
题意: 有n个珠子,每次必须涂色m个连续的。这 n个珠子是个环。询问胜负情况 思路: 对于是个环的情况,我们可以首先拿出一组m,如果n 这样环就转变为了链结构,对于一条链,sg[ i 因此转变为了 对于i>m的情况下, 如果从中拿出m个连续珠子。 子问题是: 假如在j处取这m个珠子, 左侧 j,右侧 i-m-j #include #include #define N 2原创 2017-07-28 19:11:33 · 377 阅读 · 0 评论 -
HDU 5724 Chess (状压+sg)
题意: 给出n行,每行20列,放上若干个棋子,每个棋子只能移动到其右侧第一个空位,不能移动的lost 思路: 对于每行,有2^20种状态,虽然不多,但是存不下,因此要用位来压,1 对于每行来说,因为行是一个子问题,无法再次拆解,因此直接对于行来打sg函数的表。记录每个子问题的答案,异或便是最终答案 #include #include using namespace std; const原创 2017-07-29 11:20:04 · 230 阅读 · 0 评论 -
HDU 1847 Good Luck in CET-4 Everybody!(SG)
思路: 学了学SG,模板题 #include #include #define N 20 const int MAXN=1005; int f[N],SG[MAXN],S[MAXN]; //f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理 //SG[]:0~n的SG函数值 //S[]:为x后继状态的集合 void getSG(int n) { i原创 2017-07-28 16:59:08 · 223 阅读 · 0 评论 -
hdu 6105 Gameia
题意: bob和alice玩游戏,bob的操作可以将与它相邻的节点有染为黑色,alice先手只能染白色。询问如果在最后所有节点颜色都是黑色,bob获胜。问输赢 思路: 对于每颗树来说,必定要分为两个节点 的情况,否则bob必败。因此判断如果拆分成若干个只有两个节点的树需要多少次切割 #include #include #include #include #include #in原创 2017-08-11 10:37:20 · 183 阅读 · 0 评论 -
hdu 1848 Fibonacci again and again(SG)
模板题。 具体 http://blog.csdn.net/luomingjun12315/article/details/45555495 #include #include #define N 20 const int MAXN=1005; int f[N],SG[MAXN],S[MAXN]; //f[N]:可改变当前状态的方式,N为方式的种类,f[N]要在getSG之前先预处理 /原创 2017-07-22 19:56:48 · 199 阅读 · 0 评论 -
51nod-1067 Bash游戏 V2
1067 Bash游戏 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 有一堆石子共有N个。A B两个人轮流拿,A先拿。每次只能拿1,3,4颗,拿到最后1颗石子的人获胜。假设A B都非常聪明,拿石子的过程中不会出现失误。给出N,问最后谁能赢得比赛。 例如N = 2。A只能拿1颗,所以B可原创 2016-10-28 16:07:20 · 714 阅读 · 0 评论 -
HDU 5011 Game-多个堆的NIM博弈
#include #include using namespace std; int main() { int n; while(~scanf("%d",&n)) { long long t ; long long ans; scanf("%lld",&ans); for(int i=2; i<=n; i+原创 2016-10-14 10:00:38 · 244 阅读 · 0 评论 -
博弈-NYOJ-题目23取石子
奇异局势 n+1 每个人面对 1~n都会胜利,那么只要给对手构造n+1的局势必胜 因此m%(n+1)==0,则必败 #include #include using namespace std; int main() { int t; cin>>t; while(t--) { int m,n; cin>>n>>m;原创 2016-09-21 15:15:06 · 310 阅读 · 0 评论 -
codeforces-366#BSpider Man
题意: 逐个给出每堆的数量 2个人玩游戏,没人只能拆分一个大于等于2的堆数,如果有一个人不能拆分,则此人判输 思路: 观察规律可得,每次偶数在原来的基础上换个人胜利,奇数不影响 #include #include using namespace std; int main() { int n; cin>>n; int ed=1; for(int i=原创 2016-09-05 20:44:04 · 240 阅读 · 0 评论 -
51nod-1072威佐夫游戏
http://blog.csdn.net/h1021456873/article/details/49748659这篇博客讲的很好关于这个博弈 #include #include #include using namespace std; int main() { int a,b; int n; cin>>n; while(n--)原创 2016-09-15 14:42:19 · 273 阅读 · 0 评论 -
51NOD1069 Nim游戏
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069 思路: 拿两堆石子举例,如果石子不等,那么第一个人必定能构造 n n的情况, 那么无论第二个人拿多少,第一个人下一次仍然保持n n 就一定能胜利。 如果石子相等, 那么第一个人必定破坏n n 的情况 ,第二个人只要反过来重新构造N N 第二个人就会胜利原创 2016-09-10 14:58:39 · 593 阅读 · 0 评论 -
51nod1066Bash游戏
如果想要胜利,那必定将此时的石子数尽力卡到能拿到最大的石子数+1; 这样对手下一次必定不能拿完,那么无论对手拿1~k哪一个,下一次自己都会胜利 #include #include using namespace std; int main() { int n,k; int T; cin>>T; while(T--) { cin>>n>>k;原创 2016-09-10 13:49:17 · 234 阅读 · 0 评论 -
HDU 5963 朋友(找规律)
题意: 中文题。 思路: 对于每种情况,可以发现当前节点的连接父亲的边权,并不受子树边权的影响。 比如 当前节点 与父节点边 是 1 改成若干次后偶数次变1, 奇数次变0,并不受子树中边的影响 #include using namespace std; const int N = 1e5 + 5; vector vec[N], tree[N], w[N], tw[N];原创 2017-10-17 09:32:53 · 255 阅读 · 0 评论