2019暑假集训 windy数
2024-10-06 19:43:06
题目描述
Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为2的正整数被称为 Windy 数。
Windy 想知道,在A和B之间,包括A和B,总共有多少个 Windy 数?
输入
一行两个数,分别为A,B。
输出
输出一个整数,表示答案。
样例输入
样例输入 1
1 10 样例输入 2
25 50
样例输出
样例输出 1
9 样例输出 2
20
提示
20%的数据,满足1<=A<=B<=1e6;
100%的数据,满足1<=A<=B<=2e9。
100%的数据,满足1<=A<=B<=2e9。
又是一道裸的数位dp,但是应当注意,为了区分前导0和中间0的区别,我们将前导0看作11,
这样可以防止前导0后面不能放置1(因为差小于2),这样即可判断每一个0前面是否为前导0,若是,则该位为前导0
上代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define olinr return
#define _ 0
#define love_nmr 0;
using namespace std;
int digit[],dp[][],idx,a,b;
int DP(int pos,int statu,int limit)
{
if(!pos)return ;
if(!limit&&~dp[pos][statu])return dp[pos][statu];
int res=;
int end=limit?digit[pos]:;
for(int i=;i<=end;i++)
{
if(abs(statu-i)<)continue;//差为2
if(statu==&&i==)res+=DP(pos-,,limit&&i==end);//前导0
else res+=DP(pos-,i,limit&&i==end);
}
if(!limit)dp[pos][statu]=res;
return res;
}
int solve(int num)
{
memset(dp,-,sizeof dp);
memset(digit,,sizeof digit);
idx=;
int temp=num;
while(temp>)
{
digit[++idx]=temp%;
temp/=;
}
return DP(idx,,);
}
int main()
{
scanf("%d%d",&a,&b);
printf("%d",solve(b)-solve(a-));
olinr ~~(^_^)*love_nmr
}
最新文章
- JavaScript - 原型
- PHP运算符
- babel 解构赋值无法问题
- Linux-深入理解Socket异常
- web 开发前端学习
- Fiddler工具的基本功能
- cordova的android notify消息通知插件
- DISPLAY_ITEM built-in in Oracle D2k Forms
- (笔记)angular 单选选项卡
- 如何在 Windows Azure 的虚拟机 ubuntu 上面安装和配置 openVPN(二)
- iOS之上线被拒
- 计算机学院大学生程序设计竞赛(2015’12) 1005 	Bitwise Equations
- 写书好累 <;HTTP抓包实战>;终于出版
- js 随机生成颜色值
- spark MLlib实现的基于朴素贝叶斯(NaiveBayes)的中文文本自动分类
- json接口返回值
- [CQOI2018]解锁屏幕
- RbbitMQ 的 python 实现方法
- 集合(从本部分开始涉及API)
- fio 磁盘性能
热门文章
- Java反射理解(五)-- 方法反射的基本操作
- 怎样解决在执行 vue init 时提示 ";vue : 无法加载文件"; 的问题?
- 谷歌浏览器禁用JS步骤
- Redis之各版本特性
- vue实现吸顶
- shell中$(( ))、$( )、``与${ }的区别详解
- Samba Server 的使用者帳號及密碼備份
- MyEclipse基本配置及优化【MyEclipse_10.7】
- C# 列表中查找大小比较
- linux常用命令(centos)