位统计法的应用

来源:互联网 发布:开普勒第一定律知乎 编辑:程序博客网 时间:2024/06/07 07:37

本文根据微信公众号算法团子的文章总结得到。

题目描述:在一堆正整数中,有一个数恰好出现了B次,而其他的数均出现了A次,一共N个数,求出那出现B次的数,数据保证有解,设题目的输入为:第一行3个正整数,n,a,b(b<a),第二行n个正整数,所有的数均在int范围之内。输出那个出现b次的数。


分析:采用位统计法解决此类问题。所有数的大小都在int范围内,所以数字的长度不超过10位,开一个10*10的二维数组,用来统计,所有数字中出现在从第一位(个位)到第10位每一位上0~9这个10个数字每个数字出现的次数。


由于只有一个数出现了b次,其他数都出现了a次,因此而且b<a,因此出现了b次的数字各个位上的数字要么与其他数有重合,会出现a*K+b次,b<a,要么不重合,出现b次,因此无论有没有重合,对a取余的结果都为b,,根据这一点,将这个数字的各个位上的数字求得组成即可,源代码如下

<pre name="code" class="cpp">#include<stdio.h>int main(){int n,a,b;scanf("%d%d%d\n",&n,&a,&b);//吃掉换行符int cnt[10][10]={0};int i,j;for(i=0;i<n;i++){char ch;j=0;while((ch=getchar())>47)cnt[j++][ch-48]++;  //这条语句具有一定的技巧性,直接得到数字的统计数量 }//输入结束后,即可得到所有数字各个位上数字之和。for(i=0;i<10;i++)for(j=0;j<10;j++){if(cnt[i][j]%a==b)printf("%c",j+'0');  //这条语句的技巧在于可以直接得到重新组合的数字。 } printf("\n");}
测试

输入:

10  4  2

55 67 55 67 67 76 76 67 76 76

输出:

55

0 0
原创粉丝点击