首页 > Windows开发 > 详细

【AcWing】第6场周赛 B题 3734. 求和 (思维)

时间:2021-08-12 23:21:01      阅读:20      评论:0      收藏:0      [点我收藏+]

AcWing 3734. 求和

其实这道题并不难,只是思维性很强!

因为 \(a\) 的各个数位不包含除了 \(4\)\(7\)? 以外的其他数字。

仔细观察数据会发现因为 \(1\le l \le r\le 10^9\) 中符合条件的其实不会很多,

所以可以选择 DFS 打表把所有符合条件的枚举出来

技术分享图片

详细见代码理解

ll l, r;
vector<ll> a;
void dfs(int u, ll x) {
    a.push_back(x);
    if (u == 10) return;
    dfs(u + 1, x * 10 + 4);
    dfs(u + 1, x * 10 + 7);
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> l >> r;
    dfs(0, 0);
    sort(a.begin(), a.end());
    ll d = lower_bound(a.begin(), a.end(), l) - a.begin();
    ll c = lower_bound(a.begin(), a.end(), r) - a.begin();
    ll sum = 0;
    if (d != c) { // 分段
        sum += a[d] * (a[d] - l + 1);
        for (int i = d + 1; i < c; ++i) sum += a[i] * (a[i] - a[i - 1]);
        if (c - 1 >= d) sum += a[c] * (r - a[c - 1]);
        cout << sum;
    } else
        cout << a[d] * (r - l + 1);
}

【AcWing】第6场周赛 B题 3734. 求和 (思维)

原文:https://www.cnblogs.com/RioTian/p/15134429.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!