Hdu 1404 Digital Deletions
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1404
刚开始想采取找规律的方法解题,可以没有发现规律。无奈,只好采用求PN点的方法。
我们假设数字最右边为第一位,且为最低位。那么可以知道当最高位为0时,那么先手的人必定能胜利,这个可以作为一个剪枝条件。
接下来就是两种操作了:1.降低其中任何一位
2.把其中一个0及这位0后面所有的数字删去
我们只需通过这两个操作,寻找目标数字的后续数字状态的PN状态,即可求得目标数字的PN状态。其实我们只需判断后续状态中有没有P点就行了,如果有P点,那么目标数字的状态为N点。如果没有N点,那么目标数字的状态为P点。通过这方法,就可以求得题目要求数字的PN状态了。
#include <iostream>
#include <cstring>
#include <sstream>
#include <cstdio> using namespace std; const int MAXN = 1000000 + 5;
int sg[MAXN]; stringstream ss;
int length ; inline int Get_digit( int num, int i ) // 求出数字第i位数,最右边为第1位
{
switch (i){
case 1: return num%10;
case 2: return num%100/10;
case 3: return num%1000/100;
case 4: return num%10000/1000;
case 5: return num%100000/10000;
default : return num/100000;
};
} int Get_sg( int num ) // 求sg值
{
if( sg[num]!=-1 )
return sg[num];
int temp = 1;
int orignal = num;
int i;
for( i=0;i<length-1;i++ ) // 缩小第i位的值
{
num = orignal;
if( Get_digit( num, i+1 )==0 )
{ // 消去0即后面所有的数
if( Get_sg( num/( temp*10 ) )==0 ) // 发现必败点
{
sg[ orignal ] = 1; // 则此点为必胜点
return 1;
}
}
num = orignal;
while( Get_digit( num, i+1)!=0 )
{
num = num - temp;
if( Get_sg( num )==0 ) // 发现必败点
{
sg[ orignal ] = 1; // 则此点为必胜点
return 1;
}
}
temp = temp * 10;
} num = orignal;
while( Get_digit(num, length)>1 ) // 最高位单独处理
{ // 避免出现 类似于 123 -> 23 的情况
num = num - temp;
if( Get_sg( num )==0 ) // 发现必败点
{
sg[ orignal ] = 1; // 则此点为必胜点
return 1;
}
}
sg[orignal] = 0; // 没有发现必败点,则此点即为必败点
return 0;
} int main()
{
memset( sg, -1,sizeof(sg) ); // 初始化
char in[10];
int num, ans;
sg[0] = 1;
sg[1] = 0; // 初始化
while( scanf("%s", in)!=EOF )
{
if( in[0]=='0' ) // 最高为为0, 则一定胜利
{
printf( "Yes\n" );
continue;
}
ss.clear();
ss << in;
ss >> num; // char转int
length = strlen(in); // 求该数字的长度
ans = Get_sg( num );
if( ans )
{
printf( "Yes\n" );
}
else
{
printf( "No\n" );
}
}
return 0;
}
Hdu 1404 Digital Deletions的更多相关文章
- HDU 1404 Digital Deletions (暴力博弈)
题意:给定一个数字串,最长是6,然后有两种操作. 第一种是,把该串中的一个数字换成一个比该数字小的数,比如 5 可以换成 0,1,2,3,4. e.g. 12345 --> 12341 第二 ...
- hdoj 1404 Digital Deletions(博弈论)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1404 一看就是博弈论的题目,但并没有什么思路,看了题解,才明白 就是求六位数的SG函数,暴力一遍,打表 ...
- hdu 1404 找sg ***
HDU 1404 Digital Deletions 一串由0~9组成的数字,可以进行两个操作:1.把其中一个数变为比它小的数:2.把其中一个数字0及其右边的所以数字删除. 两人轮流进行操作,最后把 ...
- Digital Deletions HDU - 1404
Digital deletions is a two-player game. The rule of the game is as following. Begin by writing down ...
- hdu 1404/zoj 2725 Digital Deletions 博弈论
暴力打表!! 代码如下: #include<iostream> #include<algorithm> #include<cstdio> #include<c ...
- HDU 1404 (博弈) Digital Deletions
首先如果第一个数字是0的话,那么先手必胜. 对于一个已知的先手必败状态,凡是能转移到先手必败的状态一定是必胜状态. 比如1是必败状态,那么2~9可以转移到1,所以是必胜状态. 10,10*,10**, ...
- HDU 1013 Digital Roots【字符串,水】
Digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1013 Digital Roots(to_string的具体运用)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1013 Digital Roots Time Limit: 2000/1000 MS (Java/Othe ...
- HDU 4394 Digital Square
Digital Square Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- MSSQL SERVER 2008 R2 无法连接到数据库,用户sa登录失败,错误:18456
原因:勾选了强制实施密码策略,但是设置的密码很简单依然可以,比如:123456 这是为什么?原来,这个功能要用到NetValidatePasswordPolicy() API这个函数. (该功能只有在 ...
- mac 下安装和卸载 mysql
这里有一篇文章写得很详细: http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html 关于卸载,我也百度了下.找了好几个 ...
- JAVA GUI学习 - JFileChooser文件选择器组件学习:未包括JFileChooser系统类学习
public class JFileChooserKnow { /** * @param args */ public static void main(String[] args) { // TOD ...
- ZYB's Premutation(有逆序数输出原序列,线段树)
ZYB's Premutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- HDU 4716 A Computer Graphics Problem
A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 数据库SQL基础知识
数据库: 结构化查询语言(Structured Query Language)简称SQL: 数据库管理系统(Database Management System)简称DBMS: 数据库管理 ...
- Light OJ 1104 Birthday Pardo(生日悖论)
ime Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Description Sometime ...
- table中的换行问题
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- Python学习之一
运行Python的步骤 1 加载内存 2 词法分析 3 语法分析 4编译字节码=>机器码 5运行 11:03:49 2016-01-11
- 浅谈Linux ftp服务器相关配置
首先我们需要在Linux系统下安装FTP服务器 Ubuntu sudo apt-get install....... centos yun....... 然后,我们要配置vsftpd.conf文件 ...