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