1 条题解
-
0
【例50.3】 平衡数
解题思路
对每个候选数统计各数字出现次数cnt[d]。只检查实际出现的数字,要求cnt[d]==d;出现0会使cnt[0]>0,所以必不合法。把符合的数累加。
正确性说明
按顺序完成所述运算后,每个输入元素都被处理在相应位置或统计项中。保存的中间状态与已处理数据对应,最终输出与题目定义一致。
易错点
未出现的数字不需要满足次数等于本身;求的是数值之和,不是个数。
复杂度
区间k个、D位,时间O(kD),空间O(1)。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int l, r; cin >> l >> r; long long ans = 0; for (int x = l; x <= r; x++) { int cnt[10] = {}; for (int t = x; t; t /= 10) cnt[t % 10]++; bool ok = true; for (int d = 0; d <= 9; d++) if (cnt[d] > 0 && cnt[d] != d) ok = false; if (ok) ans += x; } cout << ans << "\n"; return 0; }
- 1