阅读 96

1587: 【例 3】Windy 数

1587: 【例 3】Windy 数

时间限制: 1000 ms 内存限制: 524288 KB
提交数: 596 通过数: 366
【题目描述】

原题来自:SCOI 2009

Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。

Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?
【输入】

一行两个数,分别为A,B。
【输出】

输出一个整数,表示答案。
【输入样例】

1 10

【输出样例】

9

【提示】

样例输入 2

25 50

样例输出 2

20

数据范围与提示:

20% 的数据,满足 1≤A≤B≤106 ;

100% 的数据,满足 1≤A≤B≤2×109 。

思路:
发现自己什么都不会qwq
这只是一个很基础的板子qwq
啊啊啊ε=ε=ε=(#>д<)?

f[i][j]表示处理到第i位,第i位上的数字是j,首先在我们dfs之前要进行预处理,在预处理的时候就判断是否符合windy数定义
接下来对于所有小于x的数进行处理,因为我们的f[i][j]定义的是所有不超过上界的数,所以对于每一位都不超过x所对应的每一位的上界的数直接加上f[i][j]就可以
但是对于这样的数:有某一位达到了上界,我们就不能通过f[i][j]数组来转移,这时候应当对这样的数特殊处理,处理方式是枚举上界,枚举当前所在位上的数,如果符合windy数定义,那么就加上f[i][j](因为这个时候的确符合f[i][j]未达到上界),ans+=f[i][j]

代码:

#include
#define ll long long 
#define maxn 15
using namespace std;

ll a,b;
ll f[maxn][maxn];
ll p[maxn];

void prepare()
{
//	f[0][0]=0;
	p[0]=1;
	for(int i=1;i<=13;i++) p[i]=p[i-1]*10;
	for(int i=0;i<=9;i++) f[1][i]=1;
	for(int i=2;i<=13;i++)
		for(int j=0;j<=9;j++)
			for(int k=0;k<=9;k++)
			{
				if(abs(k-j)>=2) f[i][j]+=f[i-1][k]/*,cout<=1;i--)
	{
		y=x/p[i-1];
		for(int j=0;j=2) ans+=f[i][j]/*,cout<>a>>b;
	prepare();
//	prepare();
//cout<

原文:https://www.cnblogs.com/yxr001002/p/14437982.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐