题解 [HNOI2007]分裂游戏
题目大意
有趣的取石子游戏即将开始。 有 \(n\) 堆石头,编号为 \(0,1,2,...,n-1\)。两个人轮流挑石头。
在每个回合中,每个人选择三堆编号为 \(i,j,k\) 的石头( \(i<j\le k\) 且堆 \(i\) 中至少留下一块石头)。 然后,这个人从堆 \(i\) 中取出一块石头,再将一块石头分别加入堆 \(j\) 和堆 \(k\) 中。如果他不能按照规则挑选石头就会失败。David 第一个选择石头,他希望赢得比赛。你能写一个程序来帮助他吗?
堆数 \(n\) 不超过 \(23\)。每堆中的石块数量不超过 \(1000\) 。 假设两人非常聪明,他们将遵循最优策略来挑选石头。
思路
首先我们可以发现每个石子都是单独的,于是我们可以对于每一个石子进行考虑,于是我们转换一下问题:
现在我们有很多个石子,每个石子可以有一个位置,每一次可以把一个石子移动到后面其他两个位置。
然后我们就发现答案其实只跟每堆石子的奇偶性相关(每堆里面每个石子都是相同的,异或 \(2\) 次相当于没有)
然后我们就可以用 sg 函数解决这个问题:
\]
然后时间复杂度就是 \(\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]分裂游戏的更多相关文章
- bzoj 1188 [HNOI2007]分裂游戏 SG函数 SG定理
[HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1394 Solved: 847[Submit][Status][Dis ...
- bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 973 Solved: 599[Submit][Status ...
- bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 733 Solved: 451[Submit][Status ...
- [bzoj1188][HNOI2007]分裂游戏_博弈论
分裂游戏 bzoj-1188 HNOI-2007 题目大意:题目链接. 注释:略. 想法: 我们发现如果一个瓶子内的小球个数是奇数才是有效的. 所以我们就可以将问题变成了一个瓶子里最多只有一个球球. ...
- 题解 洛谷 P3185 【[HNOI2007]分裂游戏】
首先可以发现,当所有巧克力豆在最后一个瓶子中时,就无法再操作了,此时为必败状态. 注意到,对于每个瓶子里的巧克力豆,是可以在模\(2\)的意义下去考虑的,因为后手可以模仿先手的操作,所以就将巧克力豆个 ...
- P3185 [HNOI2007]分裂游戏
$ \color{#0066ff}{ 题目描述 }$ 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i ...
- 【BZOJ 1188】 [HNOI2007]分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- bzoj1188: [HNOI2007]分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
- [HNOI2007]分裂游戏
Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...
随机推荐
- python3使用pycuda执行简单GPU计算任务
技术背景 GPU的加速技术在深度学习.量子计算领域都已经被广泛的应用.其适用的计算模型是小内存的密集型计算场景,如果计算的模型内存较大,则需要使用到共享内存,这会直接导致巨大的数据交互的运算量,通信开 ...
- 修改Windows7系统默认软件安装目录
Windows7系统默认软件安装目录都在C盘Program Files文件夹有时候我们需要把软件安装到其他地方,如果每次安装的时候都要重新选择一次十分麻烦,下面Windows7之家教你修改软件默认安装 ...
- 面试官:如何实现LRU?你学会了吗?
面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...
- 你的 SQL 还在回表查询吗?快给它安排覆盖索引
什么是回表查询 小伙伴们可以先看这篇文章了解下什么是聚集索引和辅助索引:Are You OK?主键.聚集索引.辅助索引,简单回顾下,聚集索引的叶子节点包含完整的行数据,而非聚集索引的叶子节点存储的是每 ...
- ElasticSearch集群的安装(windows)
首先尽量保持你的磁盘空间足够大,比如你下载的软件的放在D盘,D盘尽量保持10G以上,还有C盘也差不多10G以上比较保险 一.下载 1)目前我下载的版本是elasticsearch-7.12.0-win ...
- JS019. 原生JS使用new Blob()实现带格式导出Word、Excel(提供无编程基础将页面上表格导出到本地的方法)
导出效果 代码实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 缓存一致性?get💡
大家好,我是老三,今天又是被算法致郁的一天,写篇文章缓一缓. 这篇文章,我们来看看缓存一致性问题. 缓存一致性 我接下来会巴巴说一堆缓存一致性,但是-- 作为一名暴躁老哥,我先把结论撂这了! 缓存和数 ...
- 【转】Gitlab CI & Docker & Dockerfile & Docker-compose的博客文章
gitlab权限设置 GitLab功能系列报道-标签(Labels) Gitlab CI 使用高级技巧 docker-compose是个好东西,越用越香 基于docker-compose的Gitlab ...
- ❤️❤️用最简单的方法在Webstorm中打开已存在项目 和 新建Vue项目 (亲测实用)❤️❤️
目录 一:打开已存在项目时 二:新建一个vue项目 使用webstorm创建vue项目创建vue项目各个公司用的工具都不一样 最常见的有HBuilder X,WebStorm,Visual Stu ...
- PTA 面向对象程序设计 6-1 引用作函数形参交换两个整数
引用作函数形参交换两个整数 设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作. 裁判测试程序样例: #include <iostream> ...