[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)
前赤壁赋 壬戌之秋,七月既望,苏子与客泛舟游于赤壁之下.清风徐来,水波不兴.举酒属客,诵明月之诗,歌窈窕之章.少焉,月出于东山之上,徘徊于斗牛之间.白露横江,水光接天.纵一苇之所如,凌万顷之茫然.浩浩 ...
随机推荐
- Hive开发中使用变量的两种方法
在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值.如果开发量较大.参数多的话, ...
- python requests的content和text方法的区别【转】
requests对象的get和post方法都会返回一个Response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等.其中返回的网页部分会存在.content和.text两个对 ...
- Maven 相关功能介绍
一: Maven环境隔离
- Executor框架(转)
摘要: Executor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相 ...
- 【转载】Django自带的注册登陆功能
1.登陆 知识点: a.auth.authenticate(username=name值, password=password值) 验证用户名和密码 b.auth.login(request, use ...
- elementui 之el-pagination爬坑,属性pager-count的设定
我想设置总页数为10页,页码条总是显示两个页码,其余省略号显示,我选择了pager-count,如下: <el-pagination @size-change="handleSizeC ...
- 76. Minimum Window Substring (JAVA)
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- 关于&联系我
本文已迁移至: Github博客:https://coco5666.github.io/blog/about Gitee博客:https://coco56.gitee.io/blog/about 博客 ...
- canvas在高倍屏下变模糊的处理办法
因为canvas不是矢量图,而是像图片一样是位图模式的.如果不做Retina屏适配的话,例如二倍屏,浏览器就会以2个像素点的宽度来渲染一个像素,该canvas在Retina屏幕下相当于占据了2倍的空间 ...
- python基础语法170题
语言特性 1.谈谈对 Python 和其他语言的区别2.简述解释型和编译型编程语言3.Python 的解释器种类以及相关特点?4.说说你知道的Python3 和 Python2 之间的区别?5.Pyt ...