题目:
本题要求读入 N 名学生的成绩,将获得某一给定分数的学生人数输出。
输入格式:
输入在第 1 行给出不超过 105 的正整数 N,即学生总人数。随后一行给出 N 名学生的百分制整数成绩,中间以空格分隔。最后一行给出要查询的分数个数 K(不超过 N 的正整数),随后是 K 个分数,中间以空格分隔。
输出格式:
在一行中按查询顺序给出得分等于指定分数的学生人数,中间以空格分隔,但行末不得有多余空格。
输入样例:
1 2 3
| 10 60 75 90 55 75 99 82 90 75 50 3 75 90 88
|
输出样例:
代码长度限制:16 KB
时间限制:250 ms
内存限制:64 MB
解题思路:
数据结构:
哈希表,Python里的Counter, C++ 里的unordered_map<int,int>
当然由于这题数据量小,总分只有100,我们完全可以创建一个长度100的数组。
思路:
将所有成绩出现的次数记录一下,在最后遍历 grade 输出即可。
题目留下的坑:
目前位置,你按照上面的思路可以通过前3个测试点,当遇到第4个测试点的时候会错误,因为最后一个测试点他的 k 小于后面成绩数组的长度,会导致我们输出的时候多输出。
代码:
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| from collections import Counter
N = eval(input())
student = input().split()
student = list(map(int, student))
grade = input().split()
k = int(grade[0]) grade = list(map(int, grade[1:])) cnt = Counter(student)
for i in range(k): print(cnt[grade[i]], end="") if i != k - 1: print(end=" ")
|
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <cstdio> using namespace std; int main() { int n,grade[101] = {0}; scanf("%d",&n); for(int i = 0; i < n; i++){ int temp; scanf("%d",&temp); grade[temp]++; } int k; scanf("%d",&k); for(int i = 0; i < k; i++){ int temp; scanf("%d",&temp); printf("%d",grade[temp]); if(i != k - 1){ printf(" "); } } return 0; }
|