CF1277A. Happy Birthday, Polycarp! 题解 枚举/数位DP
题目链接:http://codeforces.com/contest/1277/problem/A
题目大意:
求区间 \([1,n]\) 范围内有多少只包含一个数字的数。
比如:\(1,77,777,44,999999\) 都是只包含一个数字的数,而 \(12,11110,6969,987654321\) 这些不是。
解题思路:
本题可以采用枚举和数位DP解法来解决(当然,数位DP相对来说有些杀鸡用牛刀的感觉)。
枚举解法
首先,我们要确定,去除 \(0\) 以外,一个 \(i\) 位数最多有 \(9\) 个这样的数:
- \(1\)位数中总共有 \(9\) 个符合要求的数:\(1,2,3,4,5,6,7,8,9\);
- \(2\)位数中总共有 \(9\) 个符合要求的数:\(11,22,33,44,55,66,77,88,99\);
- \(3\)位数中总共有 \(9\) 个符合要求的数:\(111,222,333,444,555,666,777,888,999\);
- ……
因为告诉我们 \(1 \le n \le 10^9\) ,所以我们最多考虑 \(9\) 位数即可。
也就是说,所有满足要求的数只有 \(9 \times 9 = 81\) 个,我们只需要枚举这 \(81\) 个数,然后判断有多少个 \(\le n\) 即可。
实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int T, n;
int solve() {
int cnt = 0;
for (int i = 1; i <= 9; i ++) {
int s = 0;
for (int j = 0; j < 9; j ++) {
s = s * 10 + i;
if (s > n) break;
cnt ++;
}
}
return cnt;
}
int main() {
cin >> T;
while (T --) {
cin >> n;
cout << solve() << endl;
}
return 0;
}
数位DP解法
我们定义状态 \(f[pos][pre]\) 表示当
- 点前所在的数位为第 \(pos\) 位,
- 前一位放置的元素是 \(pre\)(如果前一位没有放置任何元素则 \(pre=0\))
时的方案总数。
并且开函数 dfs(int pos, int pre, bool limit) 用于求解:
- 点前所在的数位为第 \(pos\) 位;
- 前一位放置的元素是 \(pre\)(如果前一位没有放置任何元素则 \(pre=0\));
- \(limit\) 用于表示当前是否处于闲置转态
时的方案总数。
但是最终答案因为包含 \(0\) 这个方案,所以要减去 \(1\) 。
实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int f[11][11], T, n, a[11];
void init() {
memset(f, -1, sizeof(f));
}
int dfs(int pos, int pre, bool limit) {
if (pos < 0) return 1;
if (!limit && f[pos][pre] != -1) return f[pos][pre];
int up = limit ? a[pos] : 9;
int tmp = 0;
for (int i = 0; i <= up; i ++) {
if (pre == 0) {
if (i == 0) tmp += dfs(pos-1, i, limit && i==up);
else tmp += dfs(pos-1, i, limit && i==up);
}
else if (i == pre) tmp += dfs(pos-1, i, limit && i==up);
}
if (!limit) f[pos][pre] = tmp;
return tmp;
}
int get_num(int x) {
int pos = 0;
while (x) {
a[pos++] = x%10;
x /= 10;
}
return dfs(pos-1, 0, true);
}
int main() {
init();
cin >> T;
while (T --) {
cin >> n;
cout << get_num(n)-1 << endl;
}
return 0;
}
CF1277A. Happy Birthday, Polycarp! 题解 枚举/数位DP的更多相关文章
- 【好好补题,因为没准题目还会再出第三遍!!】ACM字符串-组合数学(官方题解是数位DP来写)
ACM字符串 .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM”,ACM字符串要求连在一块! ok,是不是很简单?现在告诉你n的值,你来告诉我这样的字符串有多少个 输入 ...
- BZOJ 1799 - [AHOI2009]self 同类分布 - 枚举 数位DP
Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code #include<cstd ...
- 【AHOI2009】同类分布 题解(数位DP)
题目大意:求$[l,r]$中各位数之和能被该数整除的数的个数.$0\leq l\leq r\leq 10^{18}$. ------------------------ 显然数位DP. 搜索时记录$p ...
- 2019-2020 ICPC Asia Hong Kong Regional Contest J. Junior Mathematician 题解(数位dp)
题目链接 题目大意 要你在[l,r]中找到有多少个数满足\(x\equiv f(x)(mod\; m)\) \(f(x)=\sum_{i=1}^{k-1} \sum_{j=i+1}^{k}d(x,i) ...
- P2188 小Z的 k 紧凑数 题解(数位DP)
题目链接 小Z的 k 紧凑数 解题思路 数位DP,把每一个数位的每一个数对应的可能性表示出来,然后求\(num(1,r)-num(1,l-1)\),其中\(num(i,j)\)表示\([i,j]\)区 ...
- Codeforces 834E The Bakery【枚举+数位dp】
E. Ever-Hungry Krakozyabra time limit per test:1 second memory limit per test:256 megabytes input:st ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU 5787 K-wolf Number (数位DP)
K-wolf Number 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5787 Description Alice thinks an integ ...
- bzoj 3131 [Sdoi2013]淘金(数位dp)
题目描述 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共N*N块. 一阵风吹过,金子的位置发生了 ...
随机推荐
- Python 基础09 面向对象的进一步拓展
调用类的其他信息 上一讲中提到,在定义方法时,必须有self这一个参数,这个参数表示某个对象,对象有有类的所有性质, 那么我么可以通过self 调用类属性. class Human(object): ...
- 2-3-4 tree留坑
#include<bits/stdc++.h> #define LL long long #define pii pair<int,int> #define mp make_p ...
- Libev源码分析09:select突破处理描述符个数的限制
众所周知,Linux下的多路复用函数select采用描述符集表示处理的描述符.描述符集的大小就是它所能处理的最大描述符限制.通常情况下该值为1024,等同于每个进程所能打开的描述符个数. 增大描述符集 ...
- Ubuntu 14.04 使用ntfs-config解决开机自动挂载NTFS分区的方法
先安装: sudo apt-get install ntfs-3g ntfs-config 再配置一下: sudo ntfs-config 然后就会弹出来一个对话框,选择你需要挂载的分区,点应用,再选 ...
- H3C IP的主要作用
- 【BestCoder Round #93 1002】MG loves apple
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6020 [题意] 给你一个长度为n的数字,然后让你删掉k个数字,问你有没有删数方案使得剩下的N-K个 ...
- Android 设置TextView字体颜色
设置TextView字体的颜色其实很简单,尤其是直接在XML文件中,可以直接通过textColor属性指定颜色值,达到设置文本颜色的效果:那在代码中如何动态设置字体的颜色值呢? 接下来,介绍如何通过J ...
- 【Activiti工作流引擎】官方快速入门demo
Activiti官方快速入门demo 地址: https://www.activiti.org/quick-start 0. 版本 activiti 5.22.0 JDK 1.8 1. 介绍 这个快速 ...
- activiti工作流-概述
1 应用场景 1.1 业务流程 采购系统完成了企业的日常采购管理,包括采购单管理.采购单审核.入库.结算等模块. 用户角色包括:员工.部门经理.总经理.财务. 基本业务流程如下: 1.2 ...
- Flex AIR应用的启动闪屏(必须)
说明: 一款移动应用,它必须具有启动屏幕,这点可以从我们常见的手机应用观察知道(如,你启动一个QQ,开始大约10秒钟会停留在一个界面上,之后才跳转到登陆或者是主界面). 在air移动应用中,如果不添加 ...