幸运数字Ⅱ
幸运数字Ⅱ
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; }
题解 文章被收录于专栏
主要写一些题目的题解