数位dp n内1的个数递推找规律
来源:互联网 发布:淘宝店铺旺旺更改昵称 编辑:程序博客网 时间:2024/05/17 15:19
1061:数字统计
- 查看
- 提交
- 统计
- 提问
- 总时间限制:
- 1000ms
- 内存限制:
- 10000kB
- 描述
- 给出一个整数n(1<=n<=20000000),要求输出从1到n间所有数字中“1”的出现次数.例如:数字11,1到11间数字“1”的出现次数为4。(1,10,11,11出现4次,因为11有两个1,所以出现4次)
- 输入
- 一个整数n,(1<=n<=20000000)
- 输出
- 输出一行,输出“1”的出现次数。
- 样例输入
11
- 样例输出
4
http://wyu.openjudge.cn/practice/1061
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#include<queue>#include<map>#include<stack>#define rt return#define bk break#define ct continue#define sf scanf#define pf printf#define ms memset#define si(n) sf("%d",&n)#define pi(n) pf("%d\n",n)#define REP0(i,n) for(int i=0;i<(n);i++)#define REP1(i,n) for(int i=1;i<=(n);i++)#define REP(i,s,n) for(int i=s;i<=(n);i++)#define db double#define op operator#define pb push_back#define LL long long#define INF 0x3fffffff#define eps 1e-8#define PI acos(-1)#define maxn 1010using namespace std;int f[100];void init(){ f[0]=0; for(int i=1;i<=9;i++)f[i]=1; f[10]=2; f[11]=4; for(int i=12;i<=19;i++)f[i]=f[i-1]+1; for(int i=20;i<=99;i++){ if(i%10==1)f[i]=f[i-1]+1; else f[i]=f[i-1]; }}int dp(int n){ if(n<=99)rt f[n]; int tmp=1; while(tmp<=n)tmp*=10; tmp/=10; int res; if(n/tmp==1){ res=dp(tmp-1)+dp(n%tmp)+10*(n/10-tmp/10)+(n%10)+1; }else { res=(n/tmp)*dp(tmp-1)+dp(n%tmp)+tmp; } rt res;}int main(){ #ifdef ACBang freopen("in.txt","r",stdin); freopen("dp.txt","w",stdout); #endif init(); int n; while(~sf("%d",&n)){ int ans; if(n<=99)ans=f[n]; else ans=dp(n); // pf("%d %d\n",n,ans); pf("%d\n",ans); } rt 0;}
//修剪版!!!!!!!!!#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<vector>#include<queue>#include<map>#include<stack>#define rt return#define bk break#define ct continue#define sf scanf#define pf printf#define ms memset#define si(n) sf("%d",&n)#define pi(n) pf("%d\n",n)#define REP0(i,n) for(int i=0;i<(n);i++)#define REP1(i,n) for(int i=1;i<=(n);i++)#define REP(i,s,n) for(int i=s;i<=(n);i++)#define db double#define op operator#define pb push_back#define LL long long#define INF 0x3fffffff#define eps 1e-8#define PI acos(-1)#define maxn 1010using namespace std;int dp(int n){ if(n==0)rt 0; if(n<=9)rt 1; int tmp=1; while(tmp<=n)tmp*=10; tmp/=10; int res; if(n/tmp==1){ res=dp(tmp-1)+dp(n%tmp)+10*(n/10-tmp/10)+(n%10)+1; }else { res=(n/tmp)*dp(tmp-1)+dp(n%tmp)+tmp; } rt res;}int main(){ #ifdef ACBang freopen("in.txt","r",stdin); freopen("dp.txt","w",stdout); #endif int n; while(~sf("%d",&n)){ int ans; ans=dp(n); pf("%d\n",ans); } rt 0;}
0 0
- 数位dp n内1的个数递推找规律
- hdu3709(求区间内平衡数的个数)数位dp
- (数位DP 1.2)hdu 3555 Bomb(统计1~n中,包含49的数的个数)
- 数位dp(求1-n中数字1出现的个数)
- poj3252 数位dp(所有比n小的二进制位0的个数不少于1的个数)记忆化搜索
- 求结点数位n的 二叉排序树个数
- 【51nod】1291 Farmer 【求n*m的矩形内全1的i*j的矩形个数】【dp】
- Eratosthenes筛法求1到n内的素数个数
- 从1到n个自然数中,各个数位包含1的个数
- poj 3252 数位dp(dfs写法) 二进制0出现比1多的数字个数
- 51nod 1202 子序列个数(DP,递推找规律)
- codeforces215E(数位DP,规律水过)
- 输入N判断0-N内的素数个数
- POJ 3252 Round Numbers(数位dp,区间中二进制表示时0的个数大于等于1的个数的数字的个数)
- [ACM] hdu 3555 Bomb (数位DP,统计1-N中含有“49”的总数)
- poj 1671 DP n个数分成1,2,。。。n个组的可能数
- 位运算 - 判断一个数是否为2的n次方 | 求一个数位为1的个数
- HDU 4135(Co-prime-[1,m]内与n互质的数的个数)
- 如何在Linux用C++写一个小工具
- 多线程下载
- [leetcode]
- 点击按钮出现新窗口
- 《javascript高级程序设计》读书笔记(一)javascript简介
- 数位dp n内1的个数递推找规律
- hdu 5040 bfs
- 支持多选的ListView实现方法(不需要CheckBox)
- Java进阶之美文共享
- poj3494
- 【LCA】 POJ 3417 Network 记数
- NYOJ 84 阶乘的0
- jquery获取窗口高度的方法
- 在Xcode中配置OpenGL