随笔分类 -  ZJUOJ

摘要:/*一个很有意思的问题。初看好像不好做。在看,可以转化是取石子问题。因为对于任意一堆数a,b。大的可能是小的好几倍,所以从a上取b可以取多个,然后才能转化为以b为大,a%b为小的下一堆。问题可以转化为:若干堆石子,最后一堆只有一个石子,现在要求从左开始取,只有前一堆取完才能取下一堆。谁取到最后一个石子算胜。可以使用必胜态必败态来做。假设石子数量是1 4 5 1从右往左推,1是必胜态,因为轮到自己的时候,可以执行一步操作就到达要求的目标。 5是必胜态,因为我可以只取4个,然后剩下一个给对方,然后就可以转到下一个必胜态。 4是必胜态,因为我可以只取3个,然后剩下的一个对对方,然后就可以转到下一个必 阅读全文
posted @ 2011-06-16 11:01 AC2012 阅读(241) 评论(0) 推荐(0)
摘要:/*第一个人,可以任意拿,但必须至少拿一个这个题目不同于常规的游戏题目,首先石子的个数非常的巨大,不可能计算必胜态必败态。而且两个游戏着之间有某种操作上的联系,所以这个题目必须另外来找规律首先根据规则石子个数是1的时候,必败。通过枚举前100个石子的必胜必败态,可以搞清楚必败态的规律来。其实必败态满足fibonaci数列。也就是说石子数位1 2 3 5 8 13 21 34 ..这些石子的时候,不论怎么拿,都会失败那么剩下的那些石子个数都是必胜态。这个规律刚好能够满足题目所说的游戏规则。至于这个规律怎么来得暂时我也不是很清楚。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 阅读全文
posted @ 2011-06-14 20:35 AC2012 阅读(261) 评论(0) 推荐(0)
摘要:/*单个game的游戏,可以使用sg函数计算,也可以使用必胜态,必败态推断。这里我是计算sg值来算的。如果sg值是0则必败,否则必胜*/#include <cstdio>#include <cstring>int sg[5][5][5][5][5][5];bool used[15000];char in[25];int n,A[7];void init(){ memset(sg,-1,sizeof(sg)); for(int i=0;i<=4;i++) for(int j=0;j<=4;j++) for(int k=0;k<=4;k++) for(in 阅读全文
posted @ 2011-06-14 14:29 AC2012 阅读(164) 评论(0) 推荐(0)
摘要:/*博弈问题,sg游戏。计算sg值。这里每次操作之后,会产生两个子问题。所以异或之后才是这次操作之后的sg值,然后选择一个不在这个sg集合中的最小的自然数。就ok了。easy....*/#include <cstdio>#include <cstring>int sg[55];bool used[55];int N;void init(){ sg[0] = 0; sg[1] = 0; sg[2] = 1; for(int i=3;i<=50;i++) { memset(used,0,sizeof(used)); for(int j=0;j<=i-2;j++) 阅读全文
posted @ 2011-06-14 13:16 AC2012 阅读(170) 评论(0) 推荐(0)
摘要:/*采用递推的方法稍微快点,速度1.7秒。 一般的必胜态必败态判断题目*/#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;int a,b,c;bool pn[310][310][310];void init2(){ pn[0][0][0] = 0; for(int i=0;i<=300;i++) { for(int j=0;j<=300;j++) { for(int k=0;k<=300;k++) 阅读全文
posted @ 2011-06-14 11:09 AC2012 阅读(114) 评论(0) 推荐(0)
摘要:/*1AC的感觉还是比较美妙的博弈问题,关键要知道sg函数的本质,根据定义计算出sg函数值,就可以转化为普通的Nim游戏了还算比较简单吧。*/#include <cstdio>#include <cstdlib>#include <vector>#include <cstring>#include <algorithm>using namespace std;int K,S[10010];int M;vector<int> d[110];int N;int sg[10010];bool vis[10010];int ans 阅读全文
posted @ 2011-06-14 00:35 AC2012 阅读(143) 评论(0) 推荐(0)
摘要:/*Anti-SG游戏*/#include <cstdio>int T;int N;int main(){ int ans,k,a; scanf("%d",&T); while(T--) { scanf("%d",&N); ans = 0; k = 0; for(int i=0;i<N;i++) { scanf("%d",&a); ans ^= a; if( a>1 ) k++; } if(k) { if( ans ) printf("1\n"); else prin 阅读全文
posted @ 2011-06-13 22:13 AC2012 阅读(145) 评论(0) 推荐(0)
摘要:/*有SJ 定理:对于任意的一个 Anti-SG 游戏,如果我们规定当局面中所有单一游戏的 SG 值为 0 时游戏结束,则先手必胜当且仅当以下两个条件满足任意一个:(1)游戏的 SG 函数不为 0,且游戏中某个单一游戏的 SG 函数大于1。(2)游戏的 SG 函数为 0,且游戏中没有单一游戏的 SG 函数大于 1。*/#include <cstdio>int T;int N;int main(){ int a,ans,k; scanf("%d",&T); while(T--) { scanf("%d",&N); k = 0; 阅读全文
posted @ 2011-06-13 20:31 AC2012 阅读(212) 评论(0) 推荐(0)
摘要:/* 首先给定一个有向图,这个图是原图经过floyd算法求出来的。原图的强连通分量到新图依然是强连通分量,而每个强连通分量都可以用一个环表示。 所以可以先将新图进行缩点,然后形成了一个有向无环图,对其进行floyd的反操作就可以了。*/// include file#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <cctype>#include <ctime>#include <iostream>#inc 阅读全文
posted @ 2011-06-13 14:23 AC2012 阅读(208) 评论(0) 推荐(0)
摘要:/* 有关时针和分针夹角的问题*/// include file#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <cctype>#include <ctime>#include <iostream>#include <sstream>#include <fstream>#include <iomanip>#include <bitset>#include & 阅读全文
posted @ 2011-05-02 15:51 AC2012 阅读(170) 评论(0) 推荐(0)