uva1640(数位统计)

博客介绍了如何解决UVA1640数位统计问题,通过将大范围数据分段统计,减少计算量,确保在限制时间内完成。文章详细讲解了分段统计的思路,高位数和低位数的处理,以及如何处理区间边界情况。最后给出了完整的C++代码实现。
摘要由CSDN通过智能技术生成
/*
translation:
	给出整数a,b。统计a和b之间的整数中,数字0,1,2,3...9出现的个数各是多少?并打印出来。
solution:
	1:由于数据范围太大,直接一次统计过去肯定超时,所以解决方法是按照每1000个数划分成一个区间,依次对每个区间进行统计
	累加。这样以来就能将10^8的数据量变成10^6的数据量,1s内绰绰有余。
	2:定义千位及以上的为高位数,以下的为低位数。先写个小程序,对每1000个数的区间进行观察,可以发现每个区间内的每个数
	出现的次数都为300.但是如果某个数一旦在高位数中出现,就意味着要多加上1000,因为高位数在这个区间内一直不变,所以
	出现次数多了1000。
	3:为了统计方便,每个区间的开头跟结尾都定义成1000的倍数。然后[a,b]区间内有遗漏的少部分数用暴力统计累加。
note:
	1:注意对每段区间开始统计的时候要在开始位置加上1000,不然到了最后即使p, b之间相差不到1000也会统计,相当与多统计了1次
	2:因为在开始多加了1000,所以在这里减去1000的意思是对“上一段的区间”的高位数进行统计。
	这道题可以总结出一个数位统计的方法。
date:
	2016.10.9
*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int INF = 1e8;
typedef long long ll;

ll cnt[10], res[10];
int a, b;

void output() {
	cout << cnt[0];
	for(int i = 1; i <= 9; i++)	cout << " " << cnt[i];
	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值