Hash的应用(1)
来源:互联网 发布:声音甜美的女歌手 知乎 编辑:程序博客网 时间:2024/06/01 23:41
例题1:
- 题目描述:
- 读入N名学生的成绩,将获得某一给定分数的学生人数输出。
- 输入:
- 测试输入包含若干测试用例,每个测试用例的格式为
第1行:N
第2行:N名学生的成绩,相邻两数字用一个空格间隔。
第3行:给定分数
当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。
- 输出:
- 对每个测试用例,将获得给定分数的学生人数输出。
- 样例输入:
380 60 9060285 660560 75 90 55 75750
- 样例输出:
102
本题目采用Hash思想,因为分数分布在0-100的区间内,我们声明一个全局数组score,存储每个分数出现的次数,初始化为0;
当用户输入分数i时,相应的score[i]++;这样的话,当我们录入数据完毕时,每个分数出现的次数也都已经计算出来了,若要输出分数为x的学生数,直接输出score[x]即可。
ps:其实Hash思想的好处在本例子中体现的不是很彻底,在下面的几个例子和习题中,我们会更加体会到Hash思想的优点。
----在实现该程序时,一定要注意每次while循环的最后都要把score数组的所有元素值置0,以清空上次的记录。(以下的几个题目同样也要注意这个问题)
源代码如下:
//Hash的应用--把数据本身和数据存储地址联系起来 #include <stdio.h> int score[101] = {0}; int main() { int n,m; scanf("%d",&n); while(n != 0){ for(int i = 0;i < 101;i++){ score[i] = 0; } for(int i = 0;i < n;i++){ int temp; scanf("%d",&temp); score[temp]++; } scanf("%d",&m); printf("%d\n",score[m]); scanf("%d",&n); //一定要记得,每循环一次都要把score中上一次的记录清空 for(int i = 0;i < 101;i++){ score[i] = 0; } } return 0; }
例题二:
- 题目描述:
给你n个整数,请按从大到小的顺序输出其中前m大的数。
- 输入:
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
- 输出:
对每组测试数据按从大到小的顺序输出前m大的数。
- 样例输入:
5 33 -35 92 213 -644
- 样例输出:
213 92 3
要注意的一些问题如下:
1)首先该题目给的时间限制是1秒,也就是说算法复杂程度不能超过百万级别,即不能超过一千万。
对本题目,就算采用的是快速排序法,时间复杂度为nlog(n)(<n<1000000),也会达到千万级别。
所以根据上例的启发,我们采用Hash思想,即使要统计出现数字中较大的m个数字,也仅需要遍逆这个数组,
时间复杂度任控制在百万级别之内。
2)题目中给出的数字会有负数,我们把这些数字整体加上一个偏移值,使其移到[0,1000000]的范围内。
在输出时候,将所要出输出的数据减去这个偏移值即可。
3)本题中还要注意输出格式。
程序源代码如下:
#include <stdio.h>int arr[1000001] ={0};int main(){int n,m;while(scanf("%d%d",&n,&m) != EOF){for(int i = 0;i <n;i++){int temp;scanf("%d",&temp);arr[temp + 500000] = 1;}int count = 0;for(int i =1000000;i>=0;i--){if(arr[i] == 1){printf("%d",i-500000);count++;if(count < m){printf(" ");}else{printf("\n");break;}}}for(int i =1000000;i>=0;i--){arr[i] = 0;}}return 0;}
注明---该博客为本人王道的学习笔记记录,博客中有些总结是引用王道机试一书的。
0 0
- Hash的应用(1)
- Hash的应用(2)
- hash表的应用
- hash的巧妙应用
- 整数Hash的应用
- hash的简单应用
- Hash算法的应用
- Hash的应用
- Hash的应用
- 浅谈Hash的应用
- redis的hash应用说明
- hash表的应用HDU4886
- Hash表的简单应用
- 对称、非对称和HASH加密的应用(转)
- PAT (Course List for Student) 简单的hash应用
- hash函数应用(整理)
- Hash学习(1)-Hash表的表大小
- Hash学习(1)-Hash表的表大小
- Tomcat能启动和停止,但是输入http://localhost:8080/不能显示页面
- phoneGap3.4 添加拍照插间
- 编辑文章 - 博客频道 - CSDN.NET
- Struts2中的OGNL详解
- 深入java虚拟机(2)
- Hash的应用(1)
- CareerCup Insert 0s to maximize A*B
- WinCE串口编程API函数
- 九度oj-1341:艾薇儿的演唱会
- 开源软件mjpg-streamer 简要分析(下)
- 快恢复规划
- 如何删掉讨厌的企业qq的小尾巴-金山安全助手
- Lucene.Net
- onSaveInstanceState() 和 onRestoreInstanceState()