[CSP-S模拟测试]:取石子(博弈论+DP)
题目描述
有三堆石子,它们的石子个数分别为$x,y,z$。
$A$和$B$正在博弈,由$A$先手,双方轮流操作。
每次操作是指,选择若干堆($1-3$堆)石子,从中各取出相同数量的石子(不能$1$个都不取)。不能操作的人失败。
请判定是否先手必胜。
输入格式
第一行一个整数$T$,表示数据组数。
接下来$T$行,每行三个整数$x,y,z(1\leqslant x,y,z\leqslant 300)$,描述一组数据。
输出格式
每组数据输出一行:
$\bullet$若先手必胜,输出$Yes$,否则输出$No$
样例
样例输入:
2
1 1 1
1 2 3
样例输出:
Yes
Yes
数据范围与提示
样例解释:
第一组数据,先手可以一次把所有石子取完。
第二组数据,先手第一步可以取完第三堆石子,得到$(1,2,0)$是一个先手必败的局面,从而刚开始的先手必胜。
数据范围:
对$100\%$的数据,$T\leqslant 500$,记$M=max(x,y,z)$。
$\bullet$子任务$1$($10$分):保证$M\leqslant 7$。
$\bullet$子任务$2$($30$分):保证$M\leqslant 50$。
$\bullet$子任务$3$($30$分):保证$\min(x,y,z)=0$。
$\bullet$子任务$4$($30$分):保证$M\leqslant 300$。
题解
这是一个$DP$……
首先,设$dp[i][j][k]$表示第一堆有$i$个,第二堆有$j$个,第三堆有$k$个是否必胜。
根据博弈论思想,如果一个局面可以转移为一个必败局面,那么这个局面必胜;注意反之则不然,因为我们可以不转移向必胜的局面。
初始时将所有局面都置为负,然后从小到大枚举$i,j,k$,如果当前局面没有标记胜,则一定为负,然后将所有能转移到它的局面置为胜即可。
看似时间复杂度是$\Theta(n^4)$的,但是注意只有在负的情况下我们才枚举所有能转移到它的局面,而负的局面只有$64972$,所以还是能很快的跑过去的。
时间复杂度:$\Theta(n^3+64972\times n+T)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
char ans[301][301][301];
void pre_work()
{
int res;
for(int i=0;i<=300;i++)
for(int j=0;j<=300;j++)
for(int k=0;k<=300;k++)
{
if(ans[i][j][k])continue;
for(int l=i+1;l<=300;l++)ans[l][j][k]=1;
for(int l=j+1;l<=300;l++)ans[i][l][k]=1;
for(int l=k+1;l<=300;l++)ans[i][j][l]=1;
res=300-max(i,j);
for(int l=1;l<=res;l++)ans[i+l][j+l][k]=1;
res=300-max(i,k);
for(int l=1;l<=res;l++)ans[i+l][j][k+l]=1;
res=300-max(j,k);
for(int l=1;l<=res;l++)ans[i][j+l][k+l]=1;
res=300-max(i,max(j,k));
for(int l=1;l<=res;l++)ans[i+l][j+l][k+l]=1;
}
}
int main()
{
pre_work();
int T;scanf("%d",&T);
while(T--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
puts(ans[x][y][z]?"Yes":"No");
}
return 0;
}
rp++
[CSP-S模拟测试]:取石子(博弈论+DP)的更多相关文章
- [CSP-S模拟测试]:硬币(博弈论+DP+拓展域并查集)
题目传送门(内部题135) 输入格式 第一行包含一个整数$T$,表示数据组数. 对于每组数据,第一行两个整数$h,w$,表示棋盘大小. 接下来$h$行,每行一个长度为$w$的字符串,每个位置由为$o, ...
- 【XSY2988】取石子 博弈论
题目描述 有 \(n\) 堆石子,每堆石子的个数是 \(c_i\). Alice 和 Bob 轮流取石子(先后手未定),Alice 每次从一堆中取 \(a\) 个,Bob每次从一堆中取 \(b\) 个 ...
- 【ACM】取石子 - 博弈论
取石子(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游 ...
- [CSP-S模拟测试]:B(期望DP)
题目传送门(内部题151) 输入格式 第一行一个整数$N$. 第二行$N$个整数,第$i$个为$a_i$. 输出格式 一行一个整数,表示答案.为避免精度误差,答案对$323232323$取模. 即设答 ...
- [CSP-S模拟测试]:密码(数位DP+库默尔定理)
题目描述 为了揭穿$SERN$的阴谋,$Itaru$黑进了$SERN$的网络系统.然而,想要完全控制$SERN$,还需要知道管理员密码.$Itaru$从截获的信息中发现,$SERN$的管理员密码是两个 ...
- [CSP-S模拟测试]:玩具(概率DP)
题目描述 这个故事发生在很久以前,在$IcePrincess\text{_}1968$和$IcePrince\text{_}1968$都还在上幼儿园的时候. $IcePrince\text{_}196 ...
- [CSP-S模拟测试]:Park(树上DP)
题目描述 公园里有$n$个雕像,有$n-1$条道路分别连接其中两个雕像,任意两个雕像可以直接或间接相连.现在每个景点$i$聚集着$P_i$只鸽子,旅行家手里有$v$数量的面包屑. 一旦旅行家在雕像$i ...
- [CSP-S模拟测试]:Seat(概率DP+数学)
题目描述 有$n+2$个座位等距地排成一排,从左到右编号为$0$至$n+1$.最开始时$0$号以及$n+1$号座位上已经坐了一个小$G$,接下来会有$n$个小$G$依次找一个空座位坐下.由于小$G$们 ...
- [CSP-S模拟测试]:赤壁情(DP)
前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...
随机推荐
- Jquery复习(七)之尺寸
jQuery 尺寸 方法 jQuery 提供多个处理尺寸的重要方法: width() height() innerWidth() innerHeight() outerWidth() outerHei ...
- 运维ipvsadm配置负载均衡
一.负载均衡LVS基本介绍 LB集群的架构和原理很简单,就是当用户的请求过来时,会直接分发到Director Server上,然后它把用户的请求根据设置好的调度算法,智能均衡地分发到后端真正服务器(r ...
- CDH部署StreamSets
StreamSets是一个大数据采集工具,数据源支持包括结构化和半/非结构化,目标源支持HDFS,HBase,Hive,Kudu,Cloudera Search, ElasticSearch等.它包括 ...
- css中新增的属性calc()可以计算使用
什么是calc: calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.可以使用calc()给元素的border.margin.pading.font-s ...
- php通过反射方法调用私有方法
PHP 5 具有完整的反射 API,添加了对类.接口.函数.方法和扩展进行反向工程的能力. 下面我们演示一下如何通过反射,来调用执行一个类中的私有方法: <?php //MyClass这个类中包 ...
- ansible 的file 模块
创建.修改.删除文件或者目录: file模块 file模块常用的几个参数:state.path.src.dest.mode.owner.group.name.recurse state后面跟的参数: ...
- SQLite 参数化查询
SQLite参数化查询 首先给出两个参考博客: Sqlite DB sqlite3使用简介 贴出一段自己用的代码: #include <stdio.h> #include <stdl ...
- nova计算服务分布式
控制节点 #第一步 控制节点下载nova-conpute包 #安装依赖包 #vim /etc/nova/nova.conf [DEFAULT] my_ip=#当前节点IP use_neutron = ...
- css画心形、三角形的总结
.heart { width: 10px; height: 10px; /* position: fixed; */ background: #fff; transform: rotate(45deg ...
- Stanford CS229 Machine Learning by Andrew Ng
CS229 Machine Learning Stanford Course by Andrew Ng Course material, problem set Matlab code written ...