PATBasic——1038. 统计同成绩学生(20)

1038. 统计同成绩学生(20)

时间限制
250 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

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

输入格式:

输入在第1行给出不超过105的正整数N,即学生总人数。随后1行给出N名学生的百分制整数成绩,中间以空格分隔。最后1行给出要查询的分数个数K(不超过N的正整数),随后是K个分数,中间以空格分隔。

输出格式:

在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。

输入样例:
10
60 75 90 55 75 99 82 90 75 50
3 75 90 88
输出样例:

3 2 0

写了半个月的PAT,感觉自己今天真的是被震惊了,也意识到了自己的不足。发现自己特别容易把问题复杂化,其实,编程的精髓更多地可能在于,要把复杂的问题简单化……菜鸟一枚,今天学到的这个题的思想真的是很好的。下面写一下我的思路过程,循序渐进

题目简单易懂。首先,我也没多想,拿到题,上来开始写代码。

思路一:

新建了两个10000大小的数组,将输出的数据分开存放起来;然后两层循环嵌套,对于要找个数的b,依次在a中找,找到一个,计数器加1,依次类推。这是最直接的思路和方法。大部分的人一开始应该都是这么想的。但是!这个方法很耗时间,并不能很好地处理大量的数据,并且也比较占用内存的其实。所以呢,提交答案的时候,最后一个测试用例,就显示运行超时。自然是不行了

思路二:

发现运行超时后。我又开始想怎样能快速找到元素,其实就是在搜索元素的过程中耽误了时间嘛~很容易想到,要先对数组进行排序,加之自己之前看的各种排序的算法,想想也是有用处了,然后就开始写排序;写完之后发现,要查找的时候,还是很麻烦。于是乎,想到了二分查找。看了网上很多人写的。最终决定用数组排序结合二分查找解决这道题。二分查找有空可以写写,应该还是蛮有用的~

思路三:

这不是我想出来的,看见别人帖子上写的,不过网址忘记复制了,抱歉。

这个思路很好,意思是,将分数作为数组的下标,而对应存放的,是该分数出现的次数。这样一来,数组控制在101的大小,不管你来多少个数。并且,在查找的时候,用数组的下标进行查找就可以了。我当时简直是要疯了~为啥自己就没有想到呢~确实,这样的思路把问题简单化了100倍都不止啊,既省时间又省空间啊真是!啥也不说了,代码如下:

#include<vector>
#include <sstream>
#include<cmath>
#include<iomanip>
#include<iostream>
#include <ctype.h>
#include <stdlib.h>

using namespace std;

int main()
{
	int n;
	cin >> n;
	int scorecnt[101] = {0};//新建一个101大小的数组,将输入的分数作为下标

	for (int i = 0; i < n; i++)
	{
		int temp;
		cin >> temp;
		if ((temp >= 0) && (temp <= 100))//确保分数有效,也确保数组不会越界
		{
			scorecnt[temp]++;//重复分数加1
		}
	}

	int m;
	cin >> m;

	for (int i = 0; i < m; i++)
	{		
		int temp;
		cin >> temp;//输入要查找的分数
		if (i)
			cout << " "  << scorecnt[temp];//将其作为下标直接输出即可
		else
		{
			cout << scorecnt[temp];
		}
	}
	return 0;
}




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值