51 Nod 1009 数字1的数量(数位dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009

题目:

给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。

例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。

Input

输入N(1 <= N <= 10^9)

Output

输出包含1的个数

Input示例

12

Output示例

5题意:中文题诶题解:我们计算每个数位上1出现的次数。每个数位上数字分=0,=1,>1,三种情况讨论。举个栗子:假设我们要计算百位上1出现的次数。1.=0,出现1的可能性只由更高位决定。比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。等于更高位数字乘以当前位数,即12 * 100。2.=1,出现1的可能性由更高位和低位决定。比如12113,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12113,即12*100+13+1。3.>1,出现1的可能性只由更高位决定。比如12213,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199,即(12+1)*100。
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4
 5 int main(){
 6     int m,n,mul=1;
 7     long long ans=0;
 8     cin>>n;
 9     int t=n;
10     while(t){
11         m=t%10;
12         if(m==0)  ans+=n/(mul*10)*mul;
13         else if(m==1){
14             ans+=n/(mul*10)*mul;
15             ans+=(n%mul)+1;
16             cout<<"YY = "<<n/(mul*10)*mul+(n%mul)+1<<endl;
17         }
18         else ans+=(n/(mul*10)+1)*mul;
19         mul*=10;
20         t/=10;
21     }
22     cout<<ans<<endl;
23     return 0;
24 }
				
时间: 2024-11-08 16:37:54

51 Nod 1009 数字1的数量(数位dp)的相关文章

[51 nod]1009 数字1的数量

1009 数字1的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示例 5详解请看大牛博客:http://www.cnblogs.com/jy02414216/ar

51nod 1009 数字1的数量 数位dp

1009 数字1的数量 基准时间限制:1 秒 空间限制:131072 KB 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示例 5 #include<bits/stdc++.h> using namespace std; #define

51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示例

51Nod 1009 数字1的个数 | 数位DP

题意: 小于等于n的所有数中1的出现次数 分析: 数位DP 预处理dp[i][j]存 从1~以j开头的i位数中有几个1,那么转移方程为: if(j == 1) dp[i][j] = dp[i-1][9]*2+pow(10,i-1);else dp[i][j] = dp[i-1][9]+dp[i][j-1]; 然后注意下对于每个询问统计的时候如果当前位为1需要额外加上他后面所有位数的个数,就是n%pow(10,i-1); 这样总复杂度log(n)*10 #include <bits/stdc++.

51nod 1042 数字0-9的数量 (数位dp、dfs、前导0)

1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Input 两个数a,b(1 <= a <= b <= 10^18) Output 输出共10行,分别是0-9出现的次数 Input示例 10 19 Output示例

51Nod 1042 数字0-9的数量(数位DP)

题意: 求[l,r]中数字0-9分别出现的次数,11算两次1 思路: 数位dp题解好难写,直接贴代码吧 dp[i]表示[0, 10^i-1]中出现j的次数(按i位补全前导0,显然0-9出现的次数是相同的) 最后再减去每一位出现的前导零即可 代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<

51Nod 1009 数字1的数量

具体题解发一下大佬的分析http://blog.csdn.net/wyg1997/article/details/52169036 1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 typedef long long LL; 5 6 int main(){ 7 std::ios::sync_with_stdio(false); 8 int n; 9 cin >> n; 10 LL

51nod 1009 数位dp入门

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 数字1的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出

1042 数字0-9的数量(非数位dp解法)

1042 数字0-9的数量 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. 输入 两个数a,b(1 <= a <= b <= 10^18) 输出 输出共10行,分别是0-9出现的次数 输入样例 10 19 输出样例 1 11 1 1 1 1 1 1 1 1 题意很明确,其实只要能求的到b的就可以.然后用val(b) - val(a-1)就能得出结果