1038. 统计同成绩学生(20)
本题要求读入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;
}