幸运数字(BFS)
幸运数字Ⅱ
https://ac.nowcoder.com/acm/contest/23156/1011
这是一道关于广搜加上区间指针遍历的题,做的时候卡了很久
using namespace std;
typedef long long ll;
const ll inf = 1e9;
queue<ll> a,b;
ll l,r;
vector<ll> x,y;
int main(){
cin >> l >> r;
a.push(4);
a.push(7);
b.push(4);
b.push(7);
while(a.front() <= inf)
//首先是这里的范围问题,1e9数量级的数还是得写出来,因为虽然题目所给范围是1e9,但是一些小于1e9的数字的值取的值还是超过1e9的第一个数。
{
b.push(a.front() * 10 + 4);
b.push(a.front() * 10 + 7);
a.push(a.front() * 10 + 4);
a.push(a.front() * 10 + 7);
a.pop();
}
ll j = l;
ll sum = 0;
while(j <= r){//下面的代码最好能考虑b空的情况
while(!b.empty() && j > b.front()){
b.pop();
}//将b.front()大小调整到j本身或者之后
if (b.empty())
break;
if (j == r) {
sum+= b.front();
break;
}//如果j恰好为b.front(),则最后总和再加上b.front()即可
sum += (min(r,b.front()) - j + 1) * b.front();
j = b.front() + 1;//将j跳转到当前端点值之后
b.pop();
}
cout << sum << endl;
return 0;
}