acwing 周赛6

这篇博客探讨了一种处理边界条件的分段求和算法,通过递归生成所有可能的数字组合,并使用二分查找优化了搜索效率。算法在解决从l到r范围内所有由4和7组成且不包含连续4的数的和问题上表现优秀。代码中展示了详细的分治和排序过程,适用于数值计算和数据处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求和
分段求和,处理边界

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值