ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC15291 幸运数字Ⅱ

2022-07-16 18:02:02  阅读:157  来源: 互联网

标签:10 数字 next bfs NC15291 push 幸运


题目链接

题目

题目描述

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

输入描述

两个整数l和r (1 <= l <= r <= 1000,000,000)。

输出描述

一个数字表示答案。

示例1

输入

2 7

输出

33

示例2

输入

7 7

输出

7

题解

知识点:BFS,枚举。

显然对每个数进行枚举是不可行的。而因为一大块数对应一个幸运数字,所以考虑枚举幸运数字,再遍历快速遍历目标区间。

考虑用bfs打表,因为bfs生成的数字天然排好序了。

时间复杂度 \(O(r-l)\)

空间复杂度 \(O(?)\)

代码

#include <bits/stdc++.h>
#define ll long long

using namespace std;

vector<ll> a;

void bfs() {
    queue<ll> q;
    q.push(0);
    while (!q.empty()) {
        ll x = q.front();
        q.pop();
        if (x / (1e9) >= 1)continue;
        a.push_back(x * 10 + 4);
        a.push_back(x * 10 + 7);
        q.push(x * 10 + 4);
        q.push(x * 10 + 7);
    }
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    bfs();
    int l, r;
    cin >> l >> r;
    ll ans = 0;
    int i = 0, pos = l;
    while (a[i] < pos) i++;
    while (a[i] <= r) {
        ans += (a[i] - pos + 1) * a[i];
        pos = a[i] + 1;
        i++;
    }
    ans += (r - pos + 1) * a[i];
    cout << ans << '\n';
    return 0;
}

标签:10,数字,next,bfs,NC15291,push,幸运
来源: https://www.cnblogs.com/BlankYang/p/16484796.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有