51 nod 最小1的数量 数位DP

来源:互联网 发布:如何制作淘宝图片 编辑:程序博客网 时间:2024/06/11 18:02

题目:https://cn.vjudge.net/contest/178832#problem/C

输入1个整数n,计算从1到n各个位上1出现的次数。

思路:如果暴力,肯定是会超时的。所以要从数位上找规律。221看10位上出现1的情况,10- 19,110-119,210-219.

假如212,十位上10 19,110-119,210-212由百位和各位决定。再举些例子便可以发现,3221,十位上 10-19,110-119,210-219.。。1110-1119,1210-1219.。。。3210-3219.

pre*10+af+1;n>2时。(pre+1)*10,n==0,pre*10.

#include<iostream>using namespace std;int solve(int n){int i = 1, cur, be, af,ans=0;while (n / i){cur = n / i % 10;//当前位的数字be = n / (i * 10);该位之前的数字af = n - n / i*i;if (cur > 1)ans += (be + 1) * i;else if (cur < 1)ans += be * i;elseans += be * i + af + 1;i = i * 10;}return ans;}  int main()  {   int n;  while (cin >> n)  {  cout << solve(n) << endl;  }  return 0;  }


原创粉丝点击