题目传送门

题目大意

有趣的取石子游戏即将开始。 有 \(n\) 堆石头,编号为 \(0,1,2,...,n-1\)。两个人轮流挑石头。

在每个回合中,每个人选择三堆编号为 \(i,j,k\) 的石头( \(i<j\le k\) 且堆 \(i\) 中至少留下一块石头)。 然后,这个人从堆 \(i\) 中取出一块石头,再将一块石头分别加入堆 \(j\) 和堆 \(k\) 中。如果他不能按照规则挑选石头就会失败。David 第一个选择石头,他希望赢得比赛。你能写一个程序来帮助他吗?

堆数 \(n\) 不超过 \(23\)。每堆中的石块数量不超过 \(1000\) 。 假设两人非常聪明,他们将遵循最优策略来挑选石头。

思路

首先我们可以发现每个石子都是单独的,于是我们可以对于每一个石子进行考虑,于是我们转换一下问题:

现在我们有很多个石子,每个石子可以有一个位置,每一次可以把一个石子移动到后面其他两个位置。

然后我们就发现答案其实只跟每堆石子的奇偶性相关(每堆里面每个石子都是相同的,异或 \(2\) 次相当于没有)

然后我们就可以用 sg 函数解决这个问题:

\[sg(i)=\text{mex}\{sg(j)\oplus sg(k)\}
\]

然后时间复杂度就是 \(\Theta(n^3)\)。

\(\texttt{Code}\)

#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 105 int n,a[MAXN],SG[MAXN];
bool vis[MAXN]; void Getsg ()
{
SG[n] = 0;
for (Int i = n - 1;i;-- i)
{
memset (vis,0,sizeof (vis));
for (Int j = i + 1;j <= n;++ j)
for (Int k = j;k <= n;++ k)
vis[SG[j] ^ SG[k]] = 1;
SG[i] = 0;while (vis[SG[i]]) SG[i] ++;
}
} int read ()
{
int x = 0;char c = getchar();int f = 1;
while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}
while (c >= '0' && c <= '9'){x = (x << 3) + (x << 1) + c - '0';c = getchar();}
return x * f;
} void write (int x)
{
if (x < 0){x = -x;putchar ('-');}
if (x > 9) write (x / 10);
putchar (x % 10 + '0');
} signed main()
{
int kase = 0;
while (scanf ("%d",&n) && n)
{
for (Int i = 1;i <= n;++ i) a[i] = read ();
Getsg ();
int ans = 0,flag = 0;
for (Int i = 1;i <= n;++ i) if (a[i] & 1) ans ^= SG[i];
printf ("Game %d: ",++ kase);
for (Int i = 1;i <= n - 1;++ i)
{
if (!a[i]) continue;
for (Int j = i + 1;j <= n;++ j)
for (Int k = j;k <= n;++ k)
if ((ans ^ SG[i] ^ SG[j] ^ SG[k]) == 0)
if (!flag) flag = 1,write (i - 1),putchar (' '),write (j - 1),putchar (' '),write (k - 1),putchar ('\n');
}
if (!flag) puts ("-1 -1 -1");
}
return 0;
}

题解 [HNOI2007]分裂游戏的更多相关文章

  1. bzoj 1188 [HNOI2007]分裂游戏 SG函数 SG定理

    [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1394  Solved: 847[Submit][Status][Dis ...

  2. bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 973  Solved: 599[Submit][Status ...

  3. bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 733  Solved: 451[Submit][Status ...

  4. [bzoj1188][HNOI2007]分裂游戏_博弈论

    分裂游戏 bzoj-1188 HNOI-2007 题目大意:题目链接. 注释:略. 想法: 我们发现如果一个瓶子内的小球个数是奇数才是有效的. 所以我们就可以将问题变成了一个瓶子里最多只有一个球球. ...

  5. 题解 洛谷 P3185 【[HNOI2007]分裂游戏】

    首先可以发现,当所有巧克力豆在最后一个瓶子中时,就无法再操作了,此时为必败状态. 注意到,对于每个瓶子里的巧克力豆,是可以在模\(2\)的意义下去考虑的,因为后手可以模仿先手的操作,所以就将巧克力豆个 ...

  6. P3185 [HNOI2007]分裂游戏

    $ \color{#0066ff}{ 题目描述 }$ 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i ...

  7. 【BZOJ 1188】 [HNOI2007]分裂游戏

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  8. bzoj1188: [HNOI2007]分裂游戏

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  9. [HNOI2007]分裂游戏

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

随机推荐

  1. React 性能调优记录(下篇),如何写高性能的代码

    react性能非常重要,性能优化可以说是衡量一个react程序员水平的重要标准. 减少你的渲染 这个大家都明白,只要是父组件中用了子组件,子组件就算没用prop也会进行依次渲染, 可以用pureCom ...

  2. assign()与create()的区别

    Q:assign()与create()的区别? A:let obj = Object.assign(targetObj, -sourceObj) 作用:将一个或多个源对象自身的可枚举属性与目标对象的属 ...

  3. vue 引用 tcplayer 做直播( 俩个例子,都可以用。替换直播地址即可,后端推流,前端观看。 )

    例子一比例子二更加容易被理解.另外 m3u8 也支持 webrtc 开头的直播地址. 补充JS 得下载到本地,自行引入: https://imgcache.qq.com/open/qcloud/liv ...

  4. 七、Abp vNext 基础篇丨文章聚合功能下

    介绍 不好意思这篇文章应该早点更新的,这几天在忙CICD的东西没顾得上,等后面整好了CICD我也发2篇文章讲讲,咱们进入正题,这一章来补全剩下的 2个接口和将文章聚合进行完善. 开工 上一章大部分业务 ...

  5. 常见GDB命令

  6. LinkedList 添加元素源码解析

    jdk版本:1.8 LinkedList添加元素有两个方法:add(E e)和add(int index,E e). add(E e) /** * Appends the specified elem ...

  7. Pikachu靶场通关之XSS(跨站脚本)

    一.XSS(跨站脚本)概述 Cross-Site Scripting 简称为"CSS",为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS.一般XSS可以 ...

  8. (4)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Cloud开发环境的准备和Lombok安装步骤

    ​ 开发环境的准备主要涉及三个方面:JDK.Maven.Spring Tools 4 for Eclipse. 1.JDK JDK 的版本用 1.8 即可,环境变量大家自行去配置.配置好环境变量,在命 ...

  9. 一文搞懂Python Unittest测试方法执行顺序

    大家好~我是米洛! 欢迎关注我的公众号测试开发坑货,一起交流!点赞收藏关注,不迷路. Unittest unittest大家应该都不陌生.它作为一款博主在5-6年前最常用的单元测试框架,现在正被pyt ...

  10. DevExpress Silverlight DXChart特效总结

    1.  主题修改 引用  xmlns:core=http://schemas.devexpress.com/winfx/2008/xaml/core 在Grid中添加core:ThemeManager ...