/*
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];
uva1640(数位统计)
最新推荐文章于 2022-09-03 23:03:41 发布
博客介绍了如何解决UVA1640数位统计问题,通过将大范围数据分段统计,减少计算量,确保在限制时间内完成。文章详细讲解了分段统计的思路,高位数和低位数的处理,以及如何处理区间边界情况。最后给出了完整的C++代码实现。
摘要由CSDN通过智能技术生成