[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)
前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...
随机推荐
- IDEA Maven项目 pom.xml 找不到 Dependency 依赖
转载: IDEA Maven项目 pom.xml 找不到 Dependency 依赖 如果你的pom.xml中使用了dependencyManagement管理依赖并且添加了你本地仓库中不存在的依赖可 ...
- redis 有序集合
添加 zadd keyword 0 'eric' 0 'zhang' 0 'yun' 查看列表 zrevrange 降序排列 zrevrange keyword 0 -1 增加分数 zincr ...
- MySQL优化步 (InnoDB)
MySQL优化步 (InnoDB) 优化的优先级 数据库结构设计 SQL语句 数据库存储引擎和选择和参数配置 系统选择及优化 硬件升级 图书 MySQL必知必会 高性能MySQL 深入浅出MySQL ...
- Codeforces 1209E2. Rotate Columns (hard version)
传送门 发现 $n$ 很小,考虑状压 $dp$,但是如果强行枚举列并枚举置换再转移复杂度太高了 考虑推推结论,发现我们只要保留列最大值最大的 $n$ 列即可,证明好像挺显然: 假设我们让列最大值比较小 ...
- spring boot 是如何利用jackson进行反序列化的?
以下面的代码为例: @RestController public class HelloController { @RequestMapping("/") public BillS ...
- php获取某经纬度附近地点位置
最近在做小程序中 其中一个需求就是要到找出某个经纬度地点附近的位置 本质最终的目的就是确定以某个确定的经纬度地点,以某半径画圆形确定的4个点对应的经纬度 /** * [returnSquarePoin ...
- java hashmap&concurrentHashmap源理
Java集合:HashMap底层实现和原理(源码解析) https://www.cnblogs.com/java-jun-world2099/p/9258605.html HashMap源码解析JDK ...
- bignumber.js是一款用于任意精度十进制和非十进制算术的JavaScript库
安装 npm install bignumber.js 引入 import { BigNumber } from 'bignumber.js' 实例方法 加法:plus 0.1 + 0.2 // 0. ...
- ifconfig - 配置网络接口
总览 ifconfig [接口] ifconfig 接口 [aftype] options | address ... 描述 ifconfig 用于配置常驻内核的网络接口.它用于在引导成功时设定网络接 ...
- auto_ptr为什么不能做为vector的元素
昨天看effectve c++的时候,发现了auto_ptr这个东西.由于我待过的公司都是用的老版c++,代码里智能指针什么的完全没有出现过,都是直接操作的原始指针.虽说我很少出错,但是总归还是不太安 ...