幸运数字Ⅱ

幸运数字Ⅱ

https://ac.nowcoder.com/acm/problem/15291

题解:
这道题跟dfs有些许关系,我们可以先通过dfs把所有幸运数字给求出来,然后我再再通过sort将其排好序,这样之后就昨晚第一个处理了。
因为我们要找出一个区间内的next[x]
比如说:4-7之间next[4],next[5],next[6],next[7]都为7,所以我们没有必要取遍历这个区间来取值,我们可以直接求除这个幸运数字到区间开始的地方距离*这个幸运数字的大小,这样会加快很大的速度,之后再更新开始的区间,再重复以上操作即可。

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <list>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#include <vector>
#define maxn  100010
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
ll mod = 998244353;
using namespace std;
ll a[maxn];
int cnt=0;
void dfs(ll x){
    if(x>=5000000000) return ;
    a[cnt++]=x;
    dfs(x*10+4);
    dfs(x*10+7);
}
int main()
{
    ll x,y;
    dfs(0);
    sort(a,a+cnt);
    //for(int i=0;i<1000;i++) cout<<a[i]<<" ";
    cin>>x>>y;
    ll sum=0;
    while(x<=y){
        ll pos=lower_bound(a,a+cnt,x)-a;
        //cout<<a[pos]<<endl;
        if(a[pos]<=y)
        sum+=a[pos]*(a[pos]-x+1);
        else sum+=a[pos]*(y-x+1);
        x=a[pos]+1;
    }
    cout<<sum<<endl;
    return 0;

}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务