博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2007]分裂游戏
阅读量:6978 次
发布时间:2019-06-27

本文共 1370 字,大约阅读时间需要 4 分钟。

Description

Solution

博弈论好题。

偶数个的石子堆是可以模仿操作的,所以就没有用了。所以就成了一些01串。

每个石子的移动有点像Nim,仔细想想发现就是一堆生成两堆的Nim,把SG异或起来就行了,数据范围这么小,SG直接暴力枚举。

第一步的话就是枚举\(i,j,k\),看看第\(i\)\(-1\),第\(j,k\)\(+1\)的SG是否为\(0\)就好了。

Code

const int N = 21 + 5;int SG[N], a[N], n, bac[100];void main() {    int t = read();    while (t--) {        n = read();        for (int i = 1; i <= n; ++i) a[i] = read();        SG[n] = 0;        for (int i = n - 1; i; --i) {            memset(bac, 0, sizeof bac);            for (int j = i + 1; j <= n; ++j)                for (int k = j; k <= n; ++k) bac[SG[j] ^ SG[k]] = 1;            for (int j = 0; j < 100; ++j)                if (!bac[j]) {                    SG[i] = j;                    break;                }        }        int ans = 0, cnt = 0, x = -1, y = -1, z = -1;        for (int i = 1; i <= n; ++i)            if (a[i] % 2) ans ^= SG[i];        for (int i = 1; i <= n; ++i)            if (a[i]) {                for (int j = i + 1; j <= n; ++j) {                    for (int k = j; k <= n; ++k) {                        if ((ans ^ SG[i] ^ SG[j] ^ SG[k]) == 0) {                            cnt++;                            if (x + y + z < 0) x = i - 1, y = j - 1, z = k - 1;                        }                    }                }            }        printf("%d %d %d\n%d\n", x, y, z, cnt);    }}

转载于:https://www.cnblogs.com/wyxwyx/p/bzoj1188.html

你可能感兴趣的文章
HDU 4268 Alice and Bob [贪心]
查看>>
安卓市场--框架搭建3
查看>>
【矩阵哈希】【哈希表】bzoj2351 [BeiJing2011]Matrix
查看>>
【记忆化搜索】bzoj1652 [Usaco2006 Feb]Treats for the Cows
查看>>
returning into 语句
查看>>
JSTL 的 if else : 有 c:if 没有 else 的处理
查看>>
GNS3 模拟免费ARP
查看>>
shiro的原理理解
查看>>
半数集问题
查看>>
看图说说JVM内存
查看>>
ASP.NET Core 实现跨站登录重定向的新姿势
查看>>
JS Date 时间格式化
查看>>
socket No route to host - sovle
查看>>
仿唐集二
查看>>
abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
查看>>
SQL Kerberos的原理及实验
查看>>
Cyclic Nacklace
查看>>
分布式缓存技术之Redis_01数据结构分析
查看>>
Android 学习 笔记_08. 广播机制
查看>>
RDLC换行
查看>>