1 条题解

  • 0
    @ 1999-5-23 8:42:30

    【例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

    信息

    ID
    335
    时间
    1000ms
    内存
    64MiB
    难度
    进阶
    标签
    递交数
    0
    已通过
    0
    上传者