牛客算法周周练1 E. 幸运数字Ⅱ(BFS/分块)

题目链接:https://ac.nowcoder.com/acm/contest/5086/E

题意

定义一个数字为幸运数字当且仅当它的所有数位都是 $4$ 或者 $7$ 。
比如说,$47$、$744$、$4$ 都是幸运数字而 $5$、$17$、$467$ 都不是。
定义 $next(x)$ 为大于等于x的第一个幸运数字。给定 $l,r$,请求出 $next(l) + next(l + 1) + ... + next(r - 1) + next(r)$ 。

题解

$bfs$ 存储至大于等于 $r$ 的幸运数字,然后对区间进行分块讨论即可。

代码

#include <bits/stdc++.h>
using ll = long long;
using namespace std;

queue<ll> que;
vector<ll> a;

int main() {
    ll l, r; cin >> l >> r;
    que.push(4);
    que.push(7);
    a.push_back(0);
    while (true) {
        ll t = que.front();
        que.pop();
        a.push_back(t);
        if (t >= r) break;
        que.push(t * 10 + 4);
        que.push(t * 10 + 7);
    }
    ll ans = 0;
    for (int i = 1; i < a.size(); i++) {
        if (a[i] >= l) {
            if (a[i] >= r) {
                ans += a[i] * min(r - a[i - 1], r - l + 1);
                break;
            }
            ans += a[i] * min(a[i] - a[i - 1], a[i] - l + 1);
        }
    }
    cout << ans << "\n";
}

 

posted @ 2020-05-30 21:30  Kanoon  阅读(218)  评论(0)    收藏  举报