Poj 2282 The Counting Problem[统计区间 0 - 9出现的次数]

2024-06-07 03:32

本文主要是介绍Poj 2282 The Counting Problem[统计区间 0 - 9出现的次数],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ps:红色字体为2015/6/14更新

题目链接:http://poj.org/problem?id=2282

问题意思很简单,给你一个闭区间[a, b],问该区间内的0 - 9出现次数。。a , b <= 10^18。。题目的数据范围还没有这么大,但是,无所谓,10^18也是水水的。。。

断断续续,弄了一天这个问题。。。还是弄明白了。。但是,还是有很多模糊的地方。。但是,应该问题不大。。


我们转化成求f(x, y),代表 [1, x] 区间内 y出现的次数,当然,y < 10。。

我们的思路就是求每一位上y出现的次数。。。这就是大体上的思路。。

比如 求 f(345, 2)。

我们肯定是先求个位出现2的次数:

该位出现的2次数是怎么求解呢? 不管是哪一位上的出现某个数字都与他左边和右边的数 以及统计该位上的数有关。。有什么关系呢?

个位(34 + 1) * 1 //左边 * k

十位(3 + 1) * 10

百位(0 + 1) * 100

f(324, 2) =

个位(32 + 1) * 1

十位(3 + 0) * 10 + 4 + 1

百位(0 + 1) * 100

左位 * 该位权值 + (该位 == y ? +右位,该位 < y ? + 0,该位 > y ? + 左位权值) 

我这里定义左位该位右位为下:

比如我要统计 16546846,千位上的某个数子出现的次数。。1654为左位,6为该位,846为右位。

为什么左为上影响的个数为 left_digit * k 而不是(left_digit + 1) * k(因为我们考虑到,高位是可以为0的,如果高位为0,就是高位没有数)呢?

假设我们以上面的例子为例:1654为其左位。

我们不考虑1654作为最高位,为什么?因为,如果1654最为最高位的话,我们还需要保证其该为是大于y的,为什么?。。。。。。。。

我们把1654交给其右位来记性处理,如果当前为大于y的话,我们直接加上该位权值即可;如果等于y的话,我们直接加上其右位 ,再加1,为什么?因为我们的右位完全可以把0考虑进去,而没有任何的影响;如果当前位小于y的话,我们就不需要考虑其右位了。


这样说的比较简单。。

还需要注意一下的是,如果y == 0 的话,需要注意高位不能为0,这一点。。。


Code:

<span style="font-size:18px;">#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define INT long long//统计x < 10出现了多少次...
INT Sumof_One_num(INT n, int x)
{INT ans = 0;INT d = 0 , k = 1;while(n){//左侧影响下,应该有多少个.ans += (n / 10 - (x == 0)) * k;//右侧影响应该有多少个..if(n % 10 == x) ans += d + 1;if(n % 10 > x) ans += k;// 记录右侧..d += n % 10 * k;k = k * 10;n /= 10;cout << "ans = " << ans << endl;}return ans;
}int main()
{INT a, b;while(cin >> a >> b && (a || b)){if(a > b) swap(a, b);cout << Sumof_One_num(b, 0) - Sumof_One_num(a - 1, 0);for(int i = 1; i < 10; i ++){cout << ' ' << Sumof_One_num(b, i) - Sumof_One_num(a - 1, i);}cout << endl;}return 0;
}</span>

----->

一开始理解起来比较困难,但是,慢慢的讨论一下就会更加的明白,会有更深的认识。。



这篇关于Poj 2282 The Counting Problem[统计区间 0 - 9出现的次数]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038049

相关文章

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1502 MPI Maelstrom(单源最短路dijkstra)

题目真是长得头疼,好多生词,给跪。 没啥好说的,英语大水逼。 借助字典尝试翻译了一下,水逼直译求不喷 Description: BIT他们的超级计算机最近交货了。(定语秀了一堆词汇那就省略吧再见) Valentine McKee的研究顾问Jack Swigert,要她来测试一下这个系统。 Valentine告诉Swigert:“因为阿波罗是一个分布式共享内存的机器,所以它的内存访问