bzoj1188 分裂游戏 博弈论
2015-12-04 20:02
169 查看
这道题目子游戏居然是一个石子,涨姿势了。果然写第一道sg就被完杀Q_Q。
定义子游戏sg(x)表示x中的一个石子的sg值。由于一堆狮子中每一个石子都是独立的,所以这一堆(设有a[i])作为一个子游戏的值即a[i]&1 * sg(i)。由于这一个石子变成了另外两个石子,所以这个子游戏的后续状态值就是另外两个子游戏的亦或。表达实在不好,。。。自己体会吧。
下附AC代码:
by lych
2015.12.4
定义子游戏sg(x)表示x中的一个石子的sg值。由于一堆狮子中每一个石子都是独立的,所以这一堆(设有a[i])作为一个子游戏的值即a[i]&1 * sg(i)。由于这一个石子变成了另外两个石子,所以这个子游戏的后续状态值就是另外两个子游戏的亦或。表达实在不好,。。。自己体会吧。
下附AC代码:
<span style="font-size:18px;">#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,cnt,ans,a[25],f[25]; bool bo[10005]; int sg(int x){ if (x==n) return 0; if (f[x]!=-1) return f[x]; int j,k; memset(bo,0,sizeof(bo)); for (j=x+1; j<=n; j++) for (k=j; k<=n; k++) bo[sg(j)^sg(k)]=1; for (j=0; bo[j]; j++); return f[x]=j; } int main(){ int cas; scanf("%d",&cas); while (cas--){ scanf("%d",&n); cnt=ans=0; int i,j,k; memset(f,-1,sizeof(f)); for (i=1; i<=n; i++){ scanf("%d",&a[i]); if (a[i]&1) ans^=sg(i); } for (i=1; i<n; i++) for (j=i+1; j<=n; j++) for (k=j; k<=n; k++) if (!(ans^sg(i)^sg(j)^sg(k))) if ((++cnt)==1) printf("%d %d %d\n",i-1,j-1,k-1); if (!cnt) puts("-1 -1 -1"); printf("%d\n",cnt); } return 0; }</span>
by lych
2015.12.4
相关文章推荐
- 模拟也有动脑子,类似蛇形填数
- linux (Centos7) 编译安装nginx
- 四边形密铺平面
- HDU 1312 Red and Black --- 入门搜索 DFS解法
- 算法竞赛 之果园里的树
- Java查找数组中的最小值
- hdu2196 树形dp
- 青海湖
- ORA-00439: feature not enabled: Managed Standby
- HDU 5057 Argestes and Sequence 分块
- Matlab中画圆
- 检测调试器和trace
- 后台定位上传的代码实践
- 监督学习和无,监督学习区别
- V$SESSION_LONGOPS
- 开始了我的记录生活之旅!
- ext2/3文件系统存储,查找,新建,删除文件机制详解
- mysql key index区别
- malloc与free对被操作内存的影响
- .net开发菜鸟微信之一:菜中菜.....