牛客算法周周练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"; }

浙公网安备 33010602011771号