王道计算机考研j机试指南,王道论坛计算机考研机试指南 三 Hash的应用
发布日期:2022-02-03 13:16:47 浏览次数:9 分类:技术文章

本文共 3261 字,大约阅读时间需要 10 分钟。

例2.5

统计同成绩学生人数

(九度教程第10题)

时间限制:1秒

**内存限制:32兆 **

特殊判题:否

题目描述:

读入N名学生的成绩,将获得某一给定分数的学生人数输出。

输入:

测试输入包含若干测试用例,每个测试用例的格式为

第1行:N

第2行:N名学生的成绩,相邻两数字用一个空格间隔。

第3行:给定分数

当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。

输出:

对每个测试用例,将获得给定分数的学生人数输出。

样例输入:

3

80 60 90

60

2

85 66

0

5

60 75 90 55 75

75

0

样例输出:

1

0

2

来源:

2006年浙江大学计算机及软件工程研究生机试真题

#include

int main () {

int n;

while (scanf ("%d",&n) != EOF && n != 0) {

int Hash[101] = {0}; //输入判断增加对n是否等于零进行 判断

for (int i = 1;i <= n;i ++) {//建立一个初始为0的Hash数组用来记录各种分数出现的次 数

int x;

scanf ("%d",&x);

Hash[x] ++; //统计分数出现次数

}

int x;

scanf ("%d",&x);

printf("%d\n",Hash[x]); //得到需要查询的目标分数后,只需简单的查询我们统 计的数量即可

}

return 0;

}

例2.6

Sort

(九度教程第11题)

时间限制:1秒

**内存限制:32兆 **

特殊判题:否

题目描述:

给你n个整数,请按从大到小的顺序输出其中前m大的数。

输入:

每组测试数据有两行,第一行有两个数n,m(0

输出:

对每组测试数据按从大到小的顺序输出前m大的数。

样例输入:

5 3

3 -35 92 213 -644

样例输出:

213 92 3

#include

#define OFFSET 500000 //偏移量,用于补偿实际数字与数组下标之间偏移

int Hash[1000001]; //偏移量,用于补偿实际数字与数组下标之间偏移

int main () {

int n , m;

while (scanf ("%d%d",&n,&m) != EOF) {

for (int i = -500000;i <= 500000;i ++) {

Hash[i + OFFSET] = 0;

}//初始化,将每个数字都标记为未出现

for (int i = 1;i <= n;i ++) {

int x;

scanf ("%d",&x);

Hash[x + OFFSET] = 1; //凡是出现过的数字,该数组元素均被设置成1

}

for (int i = 500000;i >= -500000;i --) { //输出前m个数

if (Hash[i + OFFSET] == 1) { //若该数字在输入中出现

printf("%d",i); //输出该数字

m --; //输出一个数字后,m减一,直至m变为0

if (m != 0) printf(" "); //注意格式,若m个数未被输出完毕,在输出的

数字后紧跟一个空格

else {

printf("\n"); //若m个数字已经被输出完毕,则在输出的数字后面紧跟

一个换行,并跳出遍历循环

break;

}

}

}

}

return 0;

}

题目1156

谁是你的潜在朋友

(九度教程第12题)

时间限制:1秒

**内存限制:32兆 **

特殊判题:否

题目描述:

“臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。 首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。

输入:

每个案例第一行两个整数N,M,2 <= N ,M<= 200。接下来有N行,第i(i = 1,2,…,N)行每一行有一个数,表示读者i-1最喜欢的图书的编号P(1<=P<=M)

输出:

每个案例包括N行,每行一个数,第i行的数表示读者i有几个潜在朋友。如果i和任何人都没有共同喜欢的书,则输出“BeiJu”(即悲剧,^ ^)

样例输入:

4 5

2

3

2

1

样例输出:

1

BeiJu

1

BeiJu

来源:

2011年北京大学计算机研究生机试真题

#include

int main () {

int n,m;

while (scanf ("%d %d",&n,&m) != EOF) {

int a[n+1];

int Hash[200] = {0}; //输入判断增加对n是否等于零进行 判断

for (int i = 1;i <= n;i ++) {//建立一个初始为0的Hash数组用来记录各种分数出现的次 数

int x;

scanf ("%d",&x);

a[i]=x;

Hash[x] ++; //统计分数出现次数

}

for (int i = 1;i <= n;i ++) {

if( Hash[a[i]]==1||Hash[a[i]]==0 ) printf("BeiJu\n"); //得到需要查询的目标分数后,只需简单的查询我们统 计的数量即可

else printf("%d\n",Hash[a[i]]-1);

}

}

return 0;

}

//总是error

//Hash【x】错误

//没按要求读取

题目1088:剩下的树

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:7444

解决:3379

题目描述:

有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。 现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。 可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。

输入:

两个整数L(1<=L<=10000)和M(1<=M<=100)。 接下来有M组整数,每组有一对数字。

输出:

可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。

样例输入:

500 3

100 200

150 300

470 471

样例输出:

298

#include

#include

#include

using namespace std;

int Hash[10000];

int main () {

int L , M;

while (scanf ("%d%d",&L,&M) != EOF) {

int x, y, count = 0;

for (int i = 0;i <= L;i ++) {

Hash[i] = 1;

}

for (int i = 0;i < M;i ++) {

scanf ("%d%d",&x,&y);

for( int j=x; j<=y ; j++)

Hash[j] --;

}

for (int i = 0;i <= L;i ++) {

if (Hash[i] == 1) count++;

}

printf("%d\n",count);

}

return 0;

}

// count 没有在while()里面初始化导致错误

转载地址:https://blog.csdn.net/weixin_34754795/article/details/118590337 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:怎么关闭他人计算机网络,远程关机在局域网中,怎样能关闭别人的电脑呢 – 手机爱问...
下一篇:为什么计算机软件是无形资产,购买软件是否属于无形资产

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月27日 22时53分09秒