求和
分段求和,处理边界
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
ll l, r;
ll ans = 0;
ll nums[10000], cnt;
void dfs(ll x)
{
if(x > (ll)5e9) return;
if(x >= l) nums[cnt++] = x;
dfs(x * 10 + 4);
dfs(x * 10 + 7);
}
int main()
{
cin >> l >> r;
dfs(0);
sort(nums, nums+cnt);
int x1 = lower_bound(nums, nums+cnt, l) - nums;
int x2 = lower_bound(nums, nums+cnt, r) - nums;
// 分段求和
ans += (nums[x1] - l + 1) * nums[x1];
for(int i = x1 + 1; i <= x2; ++i)
ans += (nums[i] - nums[i-1]) * nums[i];
ans -= (nums[x2] - r) * nums[x2];
cout << ans << endl;
return 0;
}
// 1000000000 1000000000
// 100000000 100000000
分段求和算法实现及应用
这篇博客探讨了一种处理边界条件的分段求和算法,通过递归生成所有可能的数字组合,并使用二分查找优化了搜索效率。算法在解决从l到r范围内所有由4和7组成且不包含连续4的数的和问题上表现优秀。代码中展示了详细的分治和排序过程,适用于数值计算和数据处理场景。
479

被折叠的 条评论
为什么被折叠?



