$ \color{#0066ff}{ 题目描述 }$

Alice和Bob两个好朋含友又开始玩取石子了。游戏开始时,有N堆石子

排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个:

·从某堆石子中取走一个

·合并任意两堆石子

不能操作的人输。Alice想知道,她是否能有必胜策略。

\(\color{#0066ff}{输入格式}\)

第一行输入T,表示数据组数。

对于每组测试数据,第一行读入N。

接下来N个正整数a1,a2…an,表示每堆石子的数量。

\(\color{#0066ff}{输出格式}\)

对于每组测试数据,输出一行。

输出YES表示Alice有必胜策略,输出NO表示Alice没有必胜策略。

\(\color{#0066ff}{输入样例}\)

3
3
1 1 2
2
3 4
3
2 3 5

\(\color{#0066ff}{输出样例}\)

YES
NO
NO

\(\color{#0066ff}{数据范围与提示}\)

100%的数据满足T<=100, N<=50. ai<=1000

\(\color{#0066ff}{题解}\)

如果合并,石子数不变,如果取,石子数-1,表面上看,结局已经注定,跟操作数的奇偶有关

然而,会有这样的情况,比如1和1

合并,那么操作数-1,如果取走一个1,那么操作数-2!!!这是不一样的

于是我们发现,状态实际上只跟1的堆数和操作数有关

所以,设\(sg[x][y]\)表示当前有x堆是1,除了1的那些堆的操作数共y次的SG值

然后分别讨论所有情况进行转移

因为不涉及多个游戏的合并,所以sg不是0就是1,就不用开vis数组记录什么东西了

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
int n;
int sg[55][52050];
int work(int x, int y) {
if(!x) return y & 1;
if(y == 1) return sg[x][y] = work(x + 1, y - 1);
if(~sg[x][y]) return sg[x][y];
if(x && !work(x - 1, y)) return sg[x][y] = 1;
if(x && y && !work(x - 1, y + 1)) return sg[x][y] = 1;
if(x >= 2 && !work(x - 2, y + 2 + (y > 0))) return sg[x][y] = 1;
if(y && !work(x, y - 1)) return sg[x][y] = 1;
//拿走一个1
//1跟非1合并
//两个1合并
//某个非1堆拿走1个或合并两个非1堆
return sg[x][y] = 0;
}
int main() {
memset(sg, -1, sizeof sg);
for(int T = in(); T --> 0;) {
n = in();
int x = 0, y = 0, z;
for(int i = 1; i <= n; i++) {
z = in();
x += (z == 1);
y += (z > 1) * z;
}
y += n - x - 1;
if(y == -1) y++;
printf(!work(x, y)? "NO\n" : "YES\n");
}
return 0;
}

bzoj 3895: 取石子的更多相关文章

  1. BZOJ 3895: 取石子[SG函数 搜索]

    有N堆石子 ·从某堆石子中取走一个 ·合并任意两堆石子 不能操作的人输. 100%的数据满足T<=100,  N<=50. ai<=1000   容易发现基础操作数$d=\sum a ...

  2. bzoj 3895 取石子——博弈论

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3895 看题解:https://blog.csdn.net/popoqqq/article/d ...

  3. bzoj 3895 取石子 —— 博弈论

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3895 看了博客:https://blog.csdn.net/popoqqq/article/ ...

  4. bzoj 1874 取石子游戏 题解 &amp; SG函数初探

    [原题] 1874: [BeiJing2009 WinterCamp]取石子游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 334  Solved ...

  5. BZOJ 1874 取石子游戏 - SG函数

    Description $N$堆石子, $M$种取石子的方式, 最后取石子的人赢, 问先手是否必胜 $A_i <= 1000$,$ B_i <= 10$ Solution 由于数据很小, ...

  6. BZOJ 3895 3895: 取石子 / Luogu SP9934 ALICE - Alice and Bob (博弈 记忆化搜索)

    转自PoPoQQQ大佬博客 题目大意:给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜 直接想很难搞,我们不妨来考虑一个特殊情况 假设每堆石子的数量都&g ...

  7. 【BZOJ】3895: 取石子

    [算法]博弈论+记忆化搜索 [题意]给定n堆石子,两人轮流操作,每个人可以合并两堆石子或拿走一个石子,不能操作者输,问是否先手必胜 [题解] 首先,若所有石子堆的石子数>1,显然总操作数为(石子 ...

  8. BZOJ 1413 取石子游戏(DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1413 题意:n堆石子排成一排.每次只能在两侧的两堆中选择一堆拿.至少拿一个.谁不能操作谁 ...

  9. BZOJ 1874 取石子游戏 (NIM游戏)

    题解:简单的NIM游戏,直接计算SG函数,至于找先手策略则按字典序异或掉,去除石子后再异或判断,若可行则直接输出. #include <cstdio> const int N=1005; ...

随机推荐

  1. vue 构建前端项目并关联github

    这几天尝试用node开发一个网站,后端的接口已经初步开发完成,现在开始构建前端的项目,记录下过程,在学习下吧. 用vue-cli 构建项目,myproject.(构架过程略过) 每次在本地构建项目后和 ...

  2. kibana-4.6.3-linux-x86_64.tar.gz的下载(图文详解)

    对于Kibana ,我们知道,是Elasticsearch/Logstash/Kibana的必不可少成员. 第一步:进入Elasticsearch的官网 https://www.elastic.co/ ...

  3. 正确理解Python函数是第一类对象

    正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...

  4. Asp.net Web Application 打开 SharePoint 2010 Site 错误 The Web application at could not be found

    解决办法如下: 1. 修改项目的.net framework 为3.5 2. Application Pool 选用 Sharepoint App pool 3. 修改 web.config如下: & ...

  5. 文件流的处理 C C++

    C: 借鉴C 文件操作库函数总结 eg: #include <fstream> #include <iostream> #include <cstdio> usin ...

  6. codeforce 457DIV2 C题

    题意 你需要构造一个n个点m条边的无向有权图,要求这个图的MST中边权的和与从1到n的最短路长度都为素数 分析 可以想到这样一种贪心,在i到i+1直接连一条边,这样最短路和MST都会是同样的一些边.只 ...

  7. codeforce 462DIV2 C题

    题意 给出一个只含有1和2的序列,有n个元素,可以选择一段区间进行翻转操作,求再反转后的最大非递减子序列的长度 分析 太菜了只想出了N^2的做法.序列只有1和2,那么每个非递减子序列都会有一个分界点, ...

  8. 使用Maven构建多模块企业项目

    首先,前面几次学习已经学会了安装maven,如何创建maven项目等,最近的学习,终于有点进展了,搭建一下企业级多模块项目. 好了,废话不多说,具体如下: 首先新建一个maven项目,pom.xml的 ...

  9. Android模拟器出现emulator-5554 disconnected! Cancelling activity launch !的解决办法

    关于 emulator-5554 disconnected! Cancelling 'xxx activity launch'!的问题,解决方法: d: cd D:/Program Files/and ...

  10. 算法Sedgewick第四版-第3章Searching-搜索总结