ZOJ2725_Digital Deletions
2024-08-30 12:27:47
题意是这样的,一开始给你一串数字,两个人轮流操作,操作可以分为两种。
1、每次修改一个数字,使其变为一个小于当前的非负数。
2、移除中间的某一个0以及0右边的所有数字。
使得所有数字消失的游戏者获胜。
题目有一个很关键的条件,最多只有6为,其实我们可以这样考虑这个问题。
对于每一位,最多有11种状态,0到9以及空。
所以我们可以用6个11进制表示所有的状态,这样算来时间上是可以承受的。
然后的话,就是典型的记忆化搜了,对于每一个数,枚举每一种后继的状态,然后用基本的博弈知识判断该状态是必胜还是必败。
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 2000200
using namespace std; int f[maxn],dig[],cur,k,n;
char s[]; int dfs(int x)
{
if (x<=) return -;
if (f[x]!=) return f[x];
int tot,d;
for (int i=; i<=; i++)
{
tot=x,d=(x/dig[i])%;
if (d==) break;
for (int j=; j<d; j++)
{
tot-=dig[i];
if (dfs(tot)==-) return f[x]=;
}
if (d==)
{
if (dfs(tot/dig[i+])==-) return f[x]=;
}
}
return f[x]=-;
} int main()
{
memset(f,,sizeof f);
dig[]=dig[]=;
for (int i=; i<; i++) dig[]+=dig[i]=dig[i-]*;
dig[]*=,dig[]=dig[]*;
while (scanf("%s",s)!=EOF)
{
for (cur=,n=strlen(s)-,k=; n>=; k++,n--)
cur+=dig[k]*(s[n]-''+);
if (dfs(cur)==) printf("Yes\n");
else printf("No\n");
}
return ;
}
最新文章
- Asp.net Boilerplate之AbpSession扩展
- javascript运动系列第四篇——抖动
- C#(委托a)
- BZOJ3252: 攻略
- 如何在使用itext生成pdf文档时给文档添加背景图片
- 在进行javaIO写文件操作后文件内容为空的情况
- leetcode6
- mysql galera cluster 集群的分裂与仲裁机制
- UVA 753 UNIX 插头(EK网络流+Floyd传递闭包)
- Hive报错之java.sql.SQLException: Field &#39;IS_STOREDASSUBDIRECTORIES&#39; doesn&#39;t have a default value
- COJ 0046 20701除法
- Java Hibernate 之 Session 状态
- 转 Fragment 和 FragmentActivity的使用
- switch条件语句规则
- SVN使用方法
- windows socket 文件下载上传
- yum安装常用工具命令
- Spring Boot中CrudRepository与JpaRepository Dao中JpaRepository和JpaSpecificationExecutor查询
- Java两种核心机制
- 2017-2018-2 20165228 实验二《Java面向对象程序设计》实验报告
热门文章
- 20145209 2016-2017-2 《Java程序设计》课程总结
- 3110: [Zjoi2013]K大数查询
- MySQL入门篇(五)之高可用架构MHA
- pandaboard es 制作SD启动卡OMAP4460
- 使用idea写ssm的时候提示源文件夹中的文件找不到
- Siki_Unity_2-3_UGUI_Unity4.6 UI Beta版本入门学习(未学)
- Linux建立互信关系(ssh公钥登录)
- 关于购买Redis服务器:腾讯云、阿里云还是华为云?
- shell基础 -- 入门篇
- Python多重赋值