牛客算法周周练1 幸运数字Ⅱ(前缀和)

链接: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®。

输入描述:

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

输出描述:

一个数字表示答案。

示例1

输入
2 7
输出
33

示例2

输入
7 7
输出
7

思路:

我们可以暴力把所有幸运数字都求出来,分别记录它们的前缀和,相减就可以求出来了。在求所有幸运数字的时候可以用优先队列存储,直到超过最大值停止存储。

代码:

#include 
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
priority_queue <ll,vector<ll>,greater<ll> > pq;
ll l,r,cnt=0;
ll a[maxn];
ll solve(ll x)
{
	ll ans=0;
	for(int i=1;i<=cnt;i++)
	{
		if(a[i]<=x)
		ans+=(a[i]-a[i-1])*a[i];
		else
		{
			ans+=(x-a[i-1])*a[i];
			break;
		}
	}
	return ans;
}
int main()
{
	pq.push(4);pq.push(7);
	ll now=0;
	cin>>l>>r;
	while(now<=5e9)
	{
		now=pq.top();pq.pop();
		a[++cnt]=now;
		pq.push(now*10+4);
		pq.push(now*10+7);
	}
	cout<<solve(r)-solve(l-1)<<endl;
	return 0;
}

你可能感兴趣的:(习题)