检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
#题目背景
Windy 定义了一种 Windy 数。
#题目描述
不含前导零且相邻两个数字之差至少为 的正整数被称为 Windy 数。Windy 想知道,在 和 之间,包括 和 ,总共有多少个 Windy 数?
#输入格式
输入只有一行两个整数,分别表示 和 。
#输出格式
输出一行一个整数表示答案。
#输入输出样例
样例输入 #1
1 10
样例输出 #1
9
样例输入 #2
25 50
样例输出 #2
20
#数据范围与提示
对于 的测试点,。
#思路
数位 DP,可以使用前缀和的思想解决。先求出 和 的答案,再将二者相减即可。
设 表示长度为 的数中最高为数码是 的数的 Windy 的数的个数,有转移方程:
求取 之间的 Windy 数数量时需要将大区间分成数段区间来计算,以 为例:
-
计算 之间的 Windy 数的数量。
C++ 28
29
30
31
32
33// 次高位及以前的 Windy 数的数量
for (int i = 1; i < num.size(); i++) {
for (int j = 1; j < 10; j++) {
res += f[i][j];
}
} -
计算 之间的 Windy 数的数量。
C++ 35
36
37
38// 最高位小于原数最高位的 Windy 数的数量
for (int i = 1; i < *num.rbegin(); i++) {
res += f[num.size()][i];
} -
计算 之间的 Windy 数的数量。
C++ 40
41
42
43
44
45
46
47
48
49
50// 最高位等于原数最高位的 Windy 数
for (int i = num.size() - 1; i; i--) {
for (int j = 0; j < num[i - 1]; j++) {
if (std::abs(j - num[i]) >= 2) {
res += f[i][j];
}
}
// 如果原数的第 i 位和第 i - 1 位相差小于 2,则后续不会出现 Windy 数
if (std::abs(num[i] - num[i - 1]) < 2) break;
}
#代码
1 |
|