题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要为一条街的住户制作门牌号。
这条街一共有 202020202020 位住户,门牌号从 111 到 202020202020 编号。
小蓝制作门牌的方法是先制作 000 到 999 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、71、0、1、71、0、1、7,即需要 111 个字符 000,222 个字符 111,111 个字符 777。
请问要制作所有的 111 到 202020202020 号门牌,总共需要多少个字符 222?
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
暴力解法
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int force_count(int n, int x) {
int res = 0;
for (int i = 1; i <= n; i++) {
for (int j = i; j; j /= 10)
if (j % 10 == x) res++;
}
return res;
}
int main()
{
// 请在此输入您的代码
cout << force_count(2020, 2) << endl;
return 0;
}
数位DP
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int get(vector<int> num, int l, int r) {
int res = 0;
for (int i = l; i >= r; i--) {
res = res * 10 + num[i];
}
return res;
}
int power10(int x) {
int res = 1;
while(x--) {
res *= 10;
}
return res;
}
int count(int n, int x) {
if (!n) return 0;
vector<int> num;
while (n) {
num.push_back(n % 10);
n /= 10;
}
n = num.size();
int res = 0;
for (int i = n - 1 - !x; i >= 0; i--) {
if (i < n - 1) {
res += get(num, n-1, i + 1) * power10(i);
if (!x) res -= power10(i);
}
if (num[i] == x) res += get(num, i-1, 0) + 1;
else if (num[i] > x) res += power10(i);
}
return res;
}
int main()
{
// 请在此输入您的代码
cout << count(2020, 2) << endl;
return 0;
}
552

被折叠的 条评论
为什么被折叠?



